2026-03-25 08:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 21, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774426887.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39180.001, raw_value=39180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 28, 900269, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903275, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903304, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903315, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903326, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903337, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903348, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903360, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903371, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 21, 30, 903385, tzinfo=datetime.timezone.utc))} (T+39243072 ms) 2026-03-25 08:23:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39303068 ms) 2026-03-25 08:23:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39303068 ms) 2026-03-25 08:23:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 23, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774427007.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39300.001, raw_value=39300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 28, 901132, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904100, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904129, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904141, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904172, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904183, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904193, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904207, tzinfo=datetime.timezone.utc))} (T+39303069 ms) 2026-03-25 08:23:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 22, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774426947.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 27, 878265, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39240.001, raw_value=39240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 28, 900634, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903720, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903746, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903761, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903772, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903782, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903792, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903814, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903828, tzinfo=datetime.timezone.utc))} (T+39303070 ms) 2026-03-25 08:23:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39303071 ms) 2026-03-25 08:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39303071 ms) 2026-03-25 08:23:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 23, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774427007.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39300.001, raw_value=39300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 28, 901132, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904100, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904129, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904141, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904172, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904183, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904193, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904207, tzinfo=datetime.timezone.utc))} (T+39303072 ms) 2026-03-25 08:23:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 22, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774426947.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 27, 878265, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39240.001, raw_value=39240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 28, 900634, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903720, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903746, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903761, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903772, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903782, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903792, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903814, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 22, 30, 903828, tzinfo=datetime.timezone.utc))} (T+39303072 ms) 2026-03-25 08:24:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39363068 ms) 2026-03-25 08:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39363069 ms) 2026-03-25 08:24:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 24, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774427067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39360.001, raw_value=39360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 28, 901509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904519, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904550, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904564, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904592, tzinfo=datetime.timezone.utc))} (T+39363070 ms) 2026-03-25 08:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 23, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774427007.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39300.001, raw_value=39300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 28, 901132, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904100, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904129, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904141, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904172, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904183, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904193, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904207, tzinfo=datetime.timezone.utc))} (T+39363071 ms) 2026-03-25 08:24:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39363071 ms) 2026-03-25 08:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39363072 ms) 2026-03-25 08:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 24, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774427067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39360.001, raw_value=39360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 28, 901509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904519, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904550, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904564, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904592, tzinfo=datetime.timezone.utc))} (T+39363072 ms) 2026-03-25 08:24:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 23, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774427007.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39300.001, raw_value=39300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 28, 901132, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904100, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904129, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904141, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904172, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904183, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904193, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 23, 30, 904207, tzinfo=datetime.timezone.utc))} (T+39363073 ms) 2026-03-25 08:25:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39423068 ms) 2026-03-25 08:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39423069 ms) 2026-03-25 08:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 25, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427127.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39420.001, raw_value=39420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 28, 901369, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904338, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904350, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904360, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904370, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904393, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904403, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904416, tzinfo=datetime.timezone.utc))} (T+39423071 ms) 2026-03-25 08:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 24, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774427067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39360.001, raw_value=39360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 28, 901509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904519, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904550, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904564, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904592, tzinfo=datetime.timezone.utc))} (T+39423071 ms) 2026-03-25 08:25:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39423072 ms) 2026-03-25 08:25:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39423072 ms) 2026-03-25 08:25:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 25, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427127.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39420.001, raw_value=39420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 28, 901369, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904338, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904350, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904360, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904370, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904393, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904403, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904416, tzinfo=datetime.timezone.utc))} (T+39423076 ms) 2026-03-25 08:25:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 24, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774427067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39360.001, raw_value=39360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 28, 901509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904519, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904550, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904564, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 24, 30, 904592, tzinfo=datetime.timezone.utc))} (T+39423077 ms) 2026-03-25 08:26:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39483068 ms) 2026-03-25 08:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39483068 ms) 2026-03-25 08:26:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774427187.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39480.001, raw_value=39480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903691, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903783, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903822, tzinfo=datetime.timezone.utc))} (T+39483069 ms) 2026-03-25 08:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 25, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427127.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39420.001, raw_value=39420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 28, 901369, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904338, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904350, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904360, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904370, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904393, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904403, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904416, tzinfo=datetime.timezone.utc))} (T+39483070 ms) 2026-03-25 08:26:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39483071 ms) 2026-03-25 08:26:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39483071 ms) 2026-03-25 08:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774427187.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39480.001, raw_value=39480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903691, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903783, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903822, tzinfo=datetime.timezone.utc))} (T+39483072 ms) 2026-03-25 08:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 25, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427127.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39420.001, raw_value=39420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 28, 901369, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904338, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904350, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904360, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904370, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904393, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904403, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 25, 30, 904416, tzinfo=datetime.timezone.utc))} (T+39483073 ms) 2026-03-25 08:27:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39543068 ms) 2026-03-25 08:27:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39543069 ms) 2026-03-25 08:27:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 27, 27, 878229, tzinfo=datetime.timezone.utc), raw_value=1774427247.878229, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39540.001, raw_value=39540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878615, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 28, 901499, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904500, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904527, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904539, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904581, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904591, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904606, tzinfo=datetime.timezone.utc))} (T+39543070 ms) 2026-03-25 08:27:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774427187.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39480.001, raw_value=39480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903691, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903783, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903822, tzinfo=datetime.timezone.utc))} (T+39543071 ms) 2026-03-25 08:27:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39543071 ms) 2026-03-25 08:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39543072 ms) 2026-03-25 08:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 27, 27, 878229, tzinfo=datetime.timezone.utc), raw_value=1774427247.878229, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39540.001, raw_value=39540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878615, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 28, 901499, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904500, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904527, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904539, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904581, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904591, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904606, tzinfo=datetime.timezone.utc))} (T+39543072 ms) 2026-03-25 08:27:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774427187.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39480.001, raw_value=39480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903691, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903783, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 26, 30, 903822, tzinfo=datetime.timezone.utc))} (T+39543073 ms) 2026-03-25 08:28:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39603067 ms) 2026-03-25 08:28:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39603068 ms) 2026-03-25 08:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 28, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427307.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39600.001, raw_value=39600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 28, 900698, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903738, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903788, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903828, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903841, tzinfo=datetime.timezone.utc))} (T+39603069 ms) 2026-03-25 08:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 27, 27, 878229, tzinfo=datetime.timezone.utc), raw_value=1774427247.878229, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39540.001, raw_value=39540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878615, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 28, 901499, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904500, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904527, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904539, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904581, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904591, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904606, tzinfo=datetime.timezone.utc))} (T+39603070 ms) 2026-03-25 08:28:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39603070 ms) 2026-03-25 08:28:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39603071 ms) 2026-03-25 08:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 28, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427307.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39600.001, raw_value=39600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 28, 900698, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903738, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903788, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903828, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903841, tzinfo=datetime.timezone.utc))} (T+39603071 ms) 2026-03-25 08:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 27, 27, 878229, tzinfo=datetime.timezone.utc), raw_value=1774427247.878229, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39540.001, raw_value=39540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 27, 878615, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 28, 901499, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904500, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904527, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904539, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904581, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904591, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 27, 30, 904606, tzinfo=datetime.timezone.utc))} (T+39603072 ms) 2026-03-25 08:29:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39663067 ms) 2026-03-25 08:29:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39663068 ms) 2026-03-25 08:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 29, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774427367.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878283, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39660.001, raw_value=39660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903528, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903568, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903621, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903634, tzinfo=datetime.timezone.utc))} (T+39663068 ms) 2026-03-25 08:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 28, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427307.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39600.001, raw_value=39600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 28, 900698, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903738, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903788, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903828, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903841, tzinfo=datetime.timezone.utc))} (T+39663069 ms) 2026-03-25 08:29:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39663070 ms) 2026-03-25 08:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39663070 ms) 2026-03-25 08:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 29, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774427367.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878283, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39660.001, raw_value=39660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903528, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903568, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903621, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903634, tzinfo=datetime.timezone.utc))} (T+39663070 ms) 2026-03-25 08:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 28, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774427307.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39600.001, raw_value=39600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 28, 900698, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903738, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903788, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903828, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 28, 30, 903841, tzinfo=datetime.timezone.utc))} (T+39663071 ms) 2026-03-25 08:30:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39723068 ms) 2026-03-25 08:30:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39723068 ms) 2026-03-25 08:30:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 30, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774427427.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39720.001, raw_value=39720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904016, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904043, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904057, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904068, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904124, tzinfo=datetime.timezone.utc))} (T+39723069 ms) 2026-03-25 08:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 29, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774427367.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878283, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39660.001, raw_value=39660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903528, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903568, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903621, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903634, tzinfo=datetime.timezone.utc))} (T+39723070 ms) 2026-03-25 08:30:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39723071 ms) 2026-03-25 08:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39723071 ms) 2026-03-25 08:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 30, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774427427.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39720.001, raw_value=39720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904016, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904043, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904057, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904068, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904124, tzinfo=datetime.timezone.utc))} (T+39723072 ms) 2026-03-25 08:30:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 29, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774427367.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878283, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39660.001, raw_value=39660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 28, 900503, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903528, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903568, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903621, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 29, 30, 903634, tzinfo=datetime.timezone.utc))} (T+39723072 ms) 2026-03-25 08:31:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39783067 ms) 2026-03-25 08:31:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39783068 ms) 2026-03-25 08:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 31, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427487.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39780.001, raw_value=39780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903441, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903544, tzinfo=datetime.timezone.utc))} (T+39783069 ms) 2026-03-25 08:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 30, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774427427.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39720.001, raw_value=39720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904016, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904043, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904057, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904068, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904124, tzinfo=datetime.timezone.utc))} (T+39783071 ms) 2026-03-25 08:31:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39783073 ms) 2026-03-25 08:31:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39783073 ms) 2026-03-25 08:31:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 31, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427487.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39780.001, raw_value=39780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903441, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903544, tzinfo=datetime.timezone.utc))} (T+39783074 ms) 2026-03-25 08:31:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 30, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774427427.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39720.001, raw_value=39720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904016, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904043, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904057, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904068, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 30, 30, 904124, tzinfo=datetime.timezone.utc))} (T+39783074 ms) 2026-03-25 08:32:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39843068 ms) 2026-03-25 08:32:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39843069 ms) 2026-03-25 08:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 32, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774427547.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39840.001, raw_value=39840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 28, 901262, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904238, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904250, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904261, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904271, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904281, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904292, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904302, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904318, tzinfo=datetime.timezone.utc))} (T+39843070 ms) 2026-03-25 08:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 31, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427487.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39780.001, raw_value=39780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903441, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903544, tzinfo=datetime.timezone.utc))} (T+39843070 ms) 2026-03-25 08:32:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39843071 ms) 2026-03-25 08:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39843072 ms) 2026-03-25 08:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 32, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774427547.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39840.001, raw_value=39840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 28, 901262, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904238, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904250, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904261, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904271, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904281, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904292, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904302, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904318, tzinfo=datetime.timezone.utc))} (T+39843072 ms) 2026-03-25 08:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 31, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427487.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39780.001, raw_value=39780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903441, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 31, 30, 903544, tzinfo=datetime.timezone.utc))} (T+39843073 ms) 2026-03-25 08:33:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39903067 ms) 2026-03-25 08:33:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39903068 ms) 2026-03-25 08:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 33, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774427607.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39900.001, raw_value=39900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903390, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903412, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903444, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903454, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903469, tzinfo=datetime.timezone.utc))} (T+39903068 ms) 2026-03-25 08:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 32, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774427547.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39840.001, raw_value=39840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 28, 901262, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904238, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904250, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904261, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904271, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904281, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904292, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904302, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904318, tzinfo=datetime.timezone.utc))} (T+39903069 ms) 2026-03-25 08:33:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39903070 ms) 2026-03-25 08:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39903070 ms) 2026-03-25 08:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 33, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774427607.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39900.001, raw_value=39900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903390, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903412, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903444, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903454, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903469, tzinfo=datetime.timezone.utc))} (T+39903070 ms) 2026-03-25 08:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 32, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774427547.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39840.001, raw_value=39840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 28, 901262, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904238, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904250, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904261, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904271, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904281, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904292, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904302, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 32, 30, 904318, tzinfo=datetime.timezone.utc))} (T+39903071 ms) 2026-03-25 08:34:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+39963068 ms) 2026-03-25 08:34:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+39963068 ms) 2026-03-25 08:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 34, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774427667.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39960.001, raw_value=39960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 28, 900548, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903802, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903845, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903911, tzinfo=datetime.timezone.utc))} (T+39963069 ms) 2026-03-25 08:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 33, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774427607.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39900.001, raw_value=39900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903390, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903412, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903444, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903454, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903469, tzinfo=datetime.timezone.utc))} (T+39963070 ms) 2026-03-25 08:34:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+39963071 ms) 2026-03-25 08:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+39963071 ms) 2026-03-25 08:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 34, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774427667.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39960.001, raw_value=39960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 28, 900548, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903802, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903845, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903911, tzinfo=datetime.timezone.utc))} (T+39963071 ms) 2026-03-25 08:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 33, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774427607.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39900.001, raw_value=39900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903390, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903412, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903444, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903454, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 33, 30, 903469, tzinfo=datetime.timezone.utc))} (T+39963072 ms) 2026-03-25 08:35:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40023068 ms) 2026-03-25 08:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40023068 ms) 2026-03-25 08:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 35, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774427727.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40020.001, raw_value=40020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 28, 900983, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903930, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903978, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903999, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904020, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904033, tzinfo=datetime.timezone.utc))} (T+40023069 ms) 2026-03-25 08:35:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 34, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774427667.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39960.001, raw_value=39960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 28, 900548, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903802, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903845, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903911, tzinfo=datetime.timezone.utc))} (T+40023070 ms) 2026-03-25 08:35:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40023071 ms) 2026-03-25 08:35:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40023071 ms) 2026-03-25 08:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 35, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774427727.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40020.001, raw_value=40020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 28, 900983, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903930, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903978, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903999, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904020, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904033, tzinfo=datetime.timezone.utc))} (T+40023071 ms) 2026-03-25 08:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 34, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774427667.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=39960.001, raw_value=39960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 28, 900548, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903802, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903845, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 34, 30, 903911, tzinfo=datetime.timezone.utc))} (T+40023072 ms) 2026-03-25 08:36:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40083068 ms) 2026-03-25 08:36:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40083068 ms) 2026-03-25 08:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 36, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774427787.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40080.001, raw_value=40080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 28, 900832, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903871, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903913, tzinfo=datetime.timezone.utc))} (T+40083069 ms) 2026-03-25 08:36:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 35, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774427727.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40020.001, raw_value=40020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 28, 900983, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903930, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903978, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903999, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904020, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904033, tzinfo=datetime.timezone.utc))} (T+40083070 ms) 2026-03-25 08:36:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40083070 ms) 2026-03-25 08:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40083070 ms) 2026-03-25 08:36:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 36, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774427787.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40080.001, raw_value=40080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 28, 900832, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903871, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903913, tzinfo=datetime.timezone.utc))} (T+40083071 ms) 2026-03-25 08:36:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 35, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774427727.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40020.001, raw_value=40020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 28, 900983, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903930, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903978, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 903999, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904020, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 35, 30, 904033, tzinfo=datetime.timezone.utc))} (T+40083072 ms) 2026-03-25 08:37:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40143067 ms) 2026-03-25 08:37:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40143067 ms) 2026-03-25 08:37:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 37, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427847.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40140.001, raw_value=40140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 28, 900056, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902928, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902952, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902963, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902984, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903004, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903030, tzinfo=datetime.timezone.utc))} (T+40143068 ms) 2026-03-25 08:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 36, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774427787.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40080.001, raw_value=40080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 28, 900832, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903871, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903913, tzinfo=datetime.timezone.utc))} (T+40143069 ms) 2026-03-25 08:37:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40143070 ms) 2026-03-25 08:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40143070 ms) 2026-03-25 08:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 37, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427847.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40140.001, raw_value=40140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 28, 900056, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902928, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902952, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902963, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902984, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903004, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903030, tzinfo=datetime.timezone.utc))} (T+40143071 ms) 2026-03-25 08:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 36, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774427787.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40080.001, raw_value=40080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 28, 900832, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903829, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903871, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 36, 30, 903913, tzinfo=datetime.timezone.utc))} (T+40143072 ms) 2026-03-25 08:38:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40203067 ms) 2026-03-25 08:38:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40203068 ms) 2026-03-25 08:38:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 38, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774427907.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40200.001, raw_value=40200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 28, 900755, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903712, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903739, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903820, tzinfo=datetime.timezone.utc))} (T+40203069 ms) 2026-03-25 08:38:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 37, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427847.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40140.001, raw_value=40140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 28, 900056, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902928, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902952, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902963, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902984, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903004, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903030, tzinfo=datetime.timezone.utc))} (T+40203070 ms) 2026-03-25 08:38:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40203070 ms) 2026-03-25 08:38:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40203071 ms) 2026-03-25 08:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 38, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774427907.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40200.001, raw_value=40200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 28, 900755, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903712, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903739, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903820, tzinfo=datetime.timezone.utc))} (T+40203072 ms) 2026-03-25 08:38:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 37, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774427847.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40140.001, raw_value=40140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 28, 900056, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902928, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902952, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902963, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902984, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903004, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 37, 30, 903030, tzinfo=datetime.timezone.utc))} (T+40203072 ms) 2026-03-25 08:39:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40263067 ms) 2026-03-25 08:39:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40263068 ms) 2026-03-25 08:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 39, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774427967.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40260.001, raw_value=40260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903299, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903325, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903336, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903347, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903356, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903370, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903382, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903392, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903408, tzinfo=datetime.timezone.utc))} (T+40263068 ms) 2026-03-25 08:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 38, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774427907.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40200.001, raw_value=40200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 28, 900755, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903712, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903739, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903820, tzinfo=datetime.timezone.utc))} (T+40263069 ms) 2026-03-25 08:39:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40263070 ms) 2026-03-25 08:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40263070 ms) 2026-03-25 08:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 39, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774427967.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40260.001, raw_value=40260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903299, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903325, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903336, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903347, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903356, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903370, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903382, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903392, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903408, tzinfo=datetime.timezone.utc))} (T+40263071 ms) 2026-03-25 08:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 38, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774427907.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40200.001, raw_value=40200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 28, 900755, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903712, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903739, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903795, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 38, 30, 903820, tzinfo=datetime.timezone.utc))} (T+40263072 ms) 2026-03-25 08:40:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40323067 ms) 2026-03-25 08:40:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40323068 ms) 2026-03-25 08:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 40, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774428027.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40320.001, raw_value=40320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 28, 900609, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903657, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903685, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903707, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903717, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903727, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903766, tzinfo=datetime.timezone.utc))} (T+40323069 ms) 2026-03-25 08:40:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 39, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774427967.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40260.001, raw_value=40260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903299, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903325, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903336, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903347, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903356, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903370, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903382, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903392, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903408, tzinfo=datetime.timezone.utc))} (T+40323070 ms) 2026-03-25 08:40:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40323071 ms) 2026-03-25 08:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40323071 ms) 2026-03-25 08:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 40, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774428027.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40320.001, raw_value=40320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 28, 900609, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903657, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903685, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903707, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903717, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903727, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903766, tzinfo=datetime.timezone.utc))} (T+40323072 ms) 2026-03-25 08:40:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 39, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774427967.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40260.001, raw_value=40260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903299, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903325, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903336, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903347, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903356, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903370, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903382, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903392, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 39, 30, 903408, tzinfo=datetime.timezone.utc))} (T+40323073 ms) 2026-03-25 08:41:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40383068 ms) 2026-03-25 08:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40383069 ms) 2026-03-25 08:41:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774428087.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40380.001, raw_value=40380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 28, 901274, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904231, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904270, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904280, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904290, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904300, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904311, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904337, tzinfo=datetime.timezone.utc))} (T+40383070 ms) 2026-03-25 08:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 40, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774428027.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40320.001, raw_value=40320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 28, 900609, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903657, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903685, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903707, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903717, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903727, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903766, tzinfo=datetime.timezone.utc))} (T+40383070 ms) 2026-03-25 08:41:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40383071 ms) 2026-03-25 08:41:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40383071 ms) 2026-03-25 08:41:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774428087.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40380.001, raw_value=40380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 28, 901274, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904231, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904270, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904280, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904290, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904300, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904311, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904337, tzinfo=datetime.timezone.utc))} (T+40383073 ms) 2026-03-25 08:41:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 40, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774428027.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40320.001, raw_value=40320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 28, 900609, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903657, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903685, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903707, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903717, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903727, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 40, 30, 903766, tzinfo=datetime.timezone.utc))} (T+40383073 ms) 2026-03-25 08:42:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40443067 ms) 2026-03-25 08:42:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40443068 ms) 2026-03-25 08:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 42, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774428147.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40440.001, raw_value=40440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903597, tzinfo=datetime.timezone.utc))} (T+40443069 ms) 2026-03-25 08:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774428087.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40380.001, raw_value=40380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 28, 901274, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904231, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904270, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904280, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904290, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904300, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904311, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904337, tzinfo=datetime.timezone.utc))} (T+40443070 ms) 2026-03-25 08:42:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40443071 ms) 2026-03-25 08:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40443071 ms) 2026-03-25 08:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 42, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774428147.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40440.001, raw_value=40440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903597, tzinfo=datetime.timezone.utc))} (T+40443072 ms) 2026-03-25 08:42:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774428087.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40380.001, raw_value=40380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 28, 901274, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904231, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904270, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904280, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904290, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904300, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904311, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 41, 30, 904337, tzinfo=datetime.timezone.utc))} (T+40443073 ms) 2026-03-25 08:43:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40503067 ms) 2026-03-25 08:43:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40503068 ms) 2026-03-25 08:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 43, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774428207.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40500.001, raw_value=40500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 28, 900617, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903647, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903675, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903743, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903759, tzinfo=datetime.timezone.utc))} (T+40503069 ms) 2026-03-25 08:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 42, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774428147.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40440.001, raw_value=40440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903597, tzinfo=datetime.timezone.utc))} (T+40503070 ms) 2026-03-25 08:43:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40503071 ms) 2026-03-25 08:43:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40503071 ms) 2026-03-25 08:43:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 43, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774428207.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40500.001, raw_value=40500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 28, 900617, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903647, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903675, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903743, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903759, tzinfo=datetime.timezone.utc))} (T+40503073 ms) 2026-03-25 08:43:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 42, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774428147.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40440.001, raw_value=40440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 42, 30, 903597, tzinfo=datetime.timezone.utc))} (T+40503074 ms) 2026-03-25 08:44:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40563067 ms) 2026-03-25 08:44:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40563068 ms) 2026-03-25 08:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 44, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774428267.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40560.001, raw_value=40560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878490, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 28, 900360, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903435, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903513, tzinfo=datetime.timezone.utc))} (T+40563069 ms) 2026-03-25 08:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 43, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774428207.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40500.001, raw_value=40500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 28, 900617, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903647, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903675, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903743, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903759, tzinfo=datetime.timezone.utc))} (T+40563070 ms) 2026-03-25 08:44:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40563071 ms) 2026-03-25 08:44:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40563071 ms) 2026-03-25 08:44:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 44, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774428267.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40560.001, raw_value=40560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878490, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 28, 900360, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903435, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903513, tzinfo=datetime.timezone.utc))} (T+40563075 ms) 2026-03-25 08:44:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 43, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774428207.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40500.001, raw_value=40500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 28, 900617, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903647, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903675, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903743, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 43, 30, 903759, tzinfo=datetime.timezone.utc))} (T+40563076 ms) 2026-03-25 08:45:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40623068 ms) 2026-03-25 08:45:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40623068 ms) 2026-03-25 08:45:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 45, 27, 878243, tzinfo=datetime.timezone.utc), raw_value=1774428327.878243, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878368, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40620.001, raw_value=40620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878603, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904040, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904067, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904078, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904099, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904109, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904132, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904147, tzinfo=datetime.timezone.utc))} (T+40623070 ms) 2026-03-25 08:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 44, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774428267.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40560.001, raw_value=40560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878490, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 28, 900360, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903435, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903513, tzinfo=datetime.timezone.utc))} (T+40623071 ms) 2026-03-25 08:45:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40623072 ms) 2026-03-25 08:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40623072 ms) 2026-03-25 08:45:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 45, 27, 878243, tzinfo=datetime.timezone.utc), raw_value=1774428327.878243, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878368, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40620.001, raw_value=40620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878603, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904040, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904067, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904078, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904099, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904109, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904132, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904147, tzinfo=datetime.timezone.utc))} (T+40623076 ms) 2026-03-25 08:45:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 44, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774428267.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40560.001, raw_value=40560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 27, 878490, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 28, 900360, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903435, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 44, 30, 903513, tzinfo=datetime.timezone.utc))} (T+40623077 ms) 2026-03-25 08:46:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40683067 ms) 2026-03-25 08:46:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40683068 ms) 2026-03-25 08:46:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 46, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774428387.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40680.001, raw_value=40680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 28, 900413, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903424, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903451, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903497, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903508, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903533, tzinfo=datetime.timezone.utc))} (T+40683069 ms) 2026-03-25 08:46:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 45, 27, 878243, tzinfo=datetime.timezone.utc), raw_value=1774428327.878243, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878368, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40620.001, raw_value=40620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878603, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904040, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904067, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904078, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904099, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904109, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904132, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904147, tzinfo=datetime.timezone.utc))} (T+40683070 ms) 2026-03-25 08:46:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40683070 ms) 2026-03-25 08:46:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40683071 ms) 2026-03-25 08:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 46, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774428387.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40680.001, raw_value=40680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 28, 900413, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903424, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903451, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903497, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903508, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903533, tzinfo=datetime.timezone.utc))} (T+40683072 ms) 2026-03-25 08:46:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 45, 27, 878243, tzinfo=datetime.timezone.utc), raw_value=1774428327.878243, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878368, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40620.001, raw_value=40620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 27, 878603, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904040, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904067, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904078, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904099, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904109, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904132, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 45, 30, 904147, tzinfo=datetime.timezone.utc))} (T+40683073 ms) 2026-03-25 08:47:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40743068 ms) 2026-03-25 08:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40743068 ms) 2026-03-25 08:47:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 47, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774428447.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40740.001, raw_value=40740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903827, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903878, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903895, tzinfo=datetime.timezone.utc))} (T+40743070 ms) 2026-03-25 08:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 46, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774428387.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40680.001, raw_value=40680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 28, 900413, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903424, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903451, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903497, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903508, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903533, tzinfo=datetime.timezone.utc))} (T+40743070 ms) 2026-03-25 08:47:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40743071 ms) 2026-03-25 08:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40743071 ms) 2026-03-25 08:47:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 47, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774428447.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40740.001, raw_value=40740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903827, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903878, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903895, tzinfo=datetime.timezone.utc))} (T+40743073 ms) 2026-03-25 08:47:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 46, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774428387.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40680.001, raw_value=40680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 28, 900413, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903424, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903451, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903497, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903508, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 46, 30, 903533, tzinfo=datetime.timezone.utc))} (T+40743073 ms) 2026-03-25 08:48:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40803068 ms) 2026-03-25 08:48:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40803069 ms) 2026-03-25 08:48:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 48, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774428507.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40800.001, raw_value=40800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878547, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 28, 901578, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904550, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904580, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904592, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904613, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904633, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904659, tzinfo=datetime.timezone.utc))} (T+40803070 ms) 2026-03-25 08:48:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 47, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774428447.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40740.001, raw_value=40740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903827, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903878, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903895, tzinfo=datetime.timezone.utc))} (T+40803071 ms) 2026-03-25 08:48:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40803071 ms) 2026-03-25 08:48:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40803072 ms) 2026-03-25 08:48:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 48, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774428507.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40800.001, raw_value=40800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878547, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 28, 901578, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904550, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904580, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904592, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904613, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904633, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904659, tzinfo=datetime.timezone.utc))} (T+40803073 ms) 2026-03-25 08:48:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 47, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774428447.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40740.001, raw_value=40740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903827, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903878, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 47, 30, 903895, tzinfo=datetime.timezone.utc))} (T+40803074 ms) 2026-03-25 08:49:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40863067 ms) 2026-03-25 08:49:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40863068 ms) 2026-03-25 08:49:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 49, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774428567.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40860.001, raw_value=40860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 28, 900338, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903360, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903388, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903400, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903420, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903442, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903455, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903471, tzinfo=datetime.timezone.utc))} (T+40863069 ms) 2026-03-25 08:49:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 48, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774428507.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40800.001, raw_value=40800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878547, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 28, 901578, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904550, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904580, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904592, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904613, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904633, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904659, tzinfo=datetime.timezone.utc))} (T+40863070 ms) 2026-03-25 08:49:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40863070 ms) 2026-03-25 08:49:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40863071 ms) 2026-03-25 08:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 49, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774428567.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40860.001, raw_value=40860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 28, 900338, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903360, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903388, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903400, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903420, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903442, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903455, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903471, tzinfo=datetime.timezone.utc))} (T+40863072 ms) 2026-03-25 08:49:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 48, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774428507.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40800.001, raw_value=40800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 27, 878547, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 28, 901578, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904550, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904580, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904592, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904613, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904633, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 48, 30, 904659, tzinfo=datetime.timezone.utc))} (T+40863073 ms) 2026-03-25 08:50:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40923068 ms) 2026-03-25 08:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40923068 ms) 2026-03-25 08:50:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 50, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774428627.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40920.001, raw_value=40920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903955, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903984, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904069, tzinfo=datetime.timezone.utc))} (T+40923069 ms) 2026-03-25 08:50:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 49, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774428567.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40860.001, raw_value=40860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 28, 900338, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903360, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903388, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903400, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903420, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903442, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903455, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903471, tzinfo=datetime.timezone.utc))} (T+40923070 ms) 2026-03-25 08:50:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40923071 ms) 2026-03-25 08:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40923071 ms) 2026-03-25 08:50:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 50, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774428627.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40920.001, raw_value=40920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903955, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903984, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904069, tzinfo=datetime.timezone.utc))} (T+40923073 ms) 2026-03-25 08:50:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 49, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774428567.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40860.001, raw_value=40860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 28, 900338, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903360, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903388, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903400, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903420, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903442, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903455, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 49, 30, 903471, tzinfo=datetime.timezone.utc))} (T+40923073 ms) 2026-03-25 08:51:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+40983068 ms) 2026-03-25 08:51:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+40983068 ms) 2026-03-25 08:51:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 51, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428687.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40980.001, raw_value=40980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 28, 900783, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903833, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903861, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903872, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903940, tzinfo=datetime.timezone.utc))} (T+40983069 ms) 2026-03-25 08:51:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 50, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774428627.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40920.001, raw_value=40920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903955, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903984, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904069, tzinfo=datetime.timezone.utc))} (T+40983070 ms) 2026-03-25 08:51:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+40983071 ms) 2026-03-25 08:51:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+40983071 ms) 2026-03-25 08:51:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 51, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428687.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40980.001, raw_value=40980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 28, 900783, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903833, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903861, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903872, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903940, tzinfo=datetime.timezone.utc))} (T+40983072 ms) 2026-03-25 08:51:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 50, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774428627.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40920.001, raw_value=40920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903955, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903984, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 50, 30, 904069, tzinfo=datetime.timezone.utc))} (T+40983073 ms) 2026-03-25 08:52:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41043068 ms) 2026-03-25 08:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41043068 ms) 2026-03-25 08:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 52, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774428747.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41040.001, raw_value=41040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 28, 901239, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904159, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904187, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904199, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904220, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904242, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904268, tzinfo=datetime.timezone.utc))} (T+41043070 ms) 2026-03-25 08:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 51, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428687.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40980.001, raw_value=40980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 28, 900783, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903833, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903861, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903872, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903940, tzinfo=datetime.timezone.utc))} (T+41043071 ms) 2026-03-25 08:52:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41043072 ms) 2026-03-25 08:52:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41043072 ms) 2026-03-25 08:52:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 52, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774428747.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41040.001, raw_value=41040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 28, 901239, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904159, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904187, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904199, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904220, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904242, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904268, tzinfo=datetime.timezone.utc))} (T+41043074 ms) 2026-03-25 08:52:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 51, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428687.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=40980.001, raw_value=40980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 28, 900783, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903833, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903861, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903872, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 51, 30, 903940, tzinfo=datetime.timezone.utc))} (T+41043075 ms) 2026-03-25 08:53:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41103069 ms) 2026-03-25 08:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41103070 ms) 2026-03-25 08:53:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 53, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774428807.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41100.001, raw_value=41100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878532, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903568, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903579, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903590, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903625, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903653, tzinfo=datetime.timezone.utc))} (T+41103073 ms) 2026-03-25 08:53:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 52, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774428747.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41040.001, raw_value=41040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 28, 901239, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904159, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904187, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904199, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904220, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904242, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904268, tzinfo=datetime.timezone.utc))} (T+41103075 ms) 2026-03-25 08:53:30.914 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41103076 ms) 2026-03-25 08:53:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41103076 ms) 2026-03-25 08:53:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 53, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774428807.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41100.001, raw_value=41100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878532, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903568, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903579, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903590, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903625, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903653, tzinfo=datetime.timezone.utc))} (T+41103083 ms) 2026-03-25 08:53:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 52, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774428747.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41040.001, raw_value=41040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 28, 901239, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904159, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904187, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904199, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904220, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904242, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 52, 30, 904268, tzinfo=datetime.timezone.utc))} (T+41103084 ms) 2026-03-25 08:54:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41163066 ms) 2026-03-25 08:54:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41163067 ms) 2026-03-25 08:54:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 54, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774428867.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878246, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41160.001, raw_value=41160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878454, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 28, 899519, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902489, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902519, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902534, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902565, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902576, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902586, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902602, tzinfo=datetime.timezone.utc))} (T+41163069 ms) 2026-03-25 08:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 53, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774428807.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41100.001, raw_value=41100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878532, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903568, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903579, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903590, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903625, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903653, tzinfo=datetime.timezone.utc))} (T+41163070 ms) 2026-03-25 08:54:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41163071 ms) 2026-03-25 08:54:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41163071 ms) 2026-03-25 08:54:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 54, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774428867.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878246, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41160.001, raw_value=41160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878454, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 28, 899519, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902489, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902519, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902534, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902565, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902576, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902586, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902602, tzinfo=datetime.timezone.utc))} (T+41163077 ms) 2026-03-25 08:54:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 53, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774428807.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41100.001, raw_value=41100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 27, 878532, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 28, 900372, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903568, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903579, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903590, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903625, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 53, 30, 903653, tzinfo=datetime.timezone.utc))} (T+41163078 ms) 2026-03-25 08:55:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41223067 ms) 2026-03-25 08:55:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41223067 ms) 2026-03-25 08:55:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 55, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774428927.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878232, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41220.001, raw_value=41220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878441, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 28, 899931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902877, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902915, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902926, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902936, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902945, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902957, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902966, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902982, tzinfo=datetime.timezone.utc))} (T+41223068 ms) 2026-03-25 08:55:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 54, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774428867.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878246, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41160.001, raw_value=41160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878454, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 28, 899519, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902489, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902519, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902534, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902565, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902576, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902586, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902602, tzinfo=datetime.timezone.utc))} (T+41223069 ms) 2026-03-25 08:55:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41223069 ms) 2026-03-25 08:55:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41223070 ms) 2026-03-25 08:55:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 55, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774428927.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878232, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41220.001, raw_value=41220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878441, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 28, 899931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902877, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902915, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902926, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902936, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902945, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902957, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902966, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902982, tzinfo=datetime.timezone.utc))} (T+41223071 ms) 2026-03-25 08:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 54, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774428867.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878246, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41160.001, raw_value=41160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 27, 878454, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 28, 899519, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902489, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902519, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902534, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902565, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902576, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902586, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 54, 30, 902602, tzinfo=datetime.timezone.utc))} (T+41223071 ms) 2026-03-25 08:56:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41283067 ms) 2026-03-25 08:56:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41283067 ms) 2026-03-25 08:56:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 56, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428987.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41280.001, raw_value=41280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 28, 900067, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 902981, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903008, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903020, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903030, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903040, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903050, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903075, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903091, tzinfo=datetime.timezone.utc))} (T+41283068 ms) 2026-03-25 08:56:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 55, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774428927.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878232, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41220.001, raw_value=41220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878441, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 28, 899931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902877, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902915, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902926, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902936, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902945, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902957, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902966, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902982, tzinfo=datetime.timezone.utc))} (T+41283071 ms) 2026-03-25 08:56:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41283072 ms) 2026-03-25 08:56:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41283072 ms) 2026-03-25 08:56:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 56, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428987.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41280.001, raw_value=41280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 28, 900067, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 902981, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903008, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903020, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903030, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903040, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903050, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903075, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903091, tzinfo=datetime.timezone.utc))} (T+41283077 ms) 2026-03-25 08:56:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 55, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774428927.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878232, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41220.001, raw_value=41220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 27, 878441, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 28, 899931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902877, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902915, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902926, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902936, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902945, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902957, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902966, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 55, 30, 902982, tzinfo=datetime.timezone.utc))} (T+41283077 ms) 2026-03-25 08:57:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41343069 ms) 2026-03-25 08:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41343069 ms) 2026-03-25 08:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 57, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429047.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41340.001, raw_value=41340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878537, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 28, 902078, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905041, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905053, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905063, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905095, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905105, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905124, tzinfo=datetime.timezone.utc))} (T+41343070 ms) 2026-03-25 08:57:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 56, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428987.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41280.001, raw_value=41280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 28, 900067, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 902981, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903008, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903020, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903030, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903040, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903050, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903075, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903091, tzinfo=datetime.timezone.utc))} (T+41343071 ms) 2026-03-25 08:57:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41343072 ms) 2026-03-25 08:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41343072 ms) 2026-03-25 08:57:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 57, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429047.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41340.001, raw_value=41340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878537, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 28, 902078, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905041, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905053, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905063, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905095, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905105, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905124, tzinfo=datetime.timezone.utc))} (T+41343073 ms) 2026-03-25 08:57:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 56, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774428987.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41280.001, raw_value=41280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 28, 900067, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 902981, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903008, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903020, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903030, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903040, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903050, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903075, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 56, 30, 903091, tzinfo=datetime.timezone.utc))} (T+41343074 ms) 2026-03-25 08:58:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41403067 ms) 2026-03-25 08:58:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41403068 ms) 2026-03-25 08:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 58, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774429107.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41400.001, raw_value=41400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 28, 900601, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903582, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903609, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903624, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903635, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903645, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903655, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903667, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903676, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903692, tzinfo=datetime.timezone.utc))} (T+41403070 ms) 2026-03-25 08:58:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 57, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429047.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41340.001, raw_value=41340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878537, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 28, 902078, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905041, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905053, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905063, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905095, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905105, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905124, tzinfo=datetime.timezone.utc))} (T+41403070 ms) 2026-03-25 08:58:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41403071 ms) 2026-03-25 08:58:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41403071 ms) 2026-03-25 08:58:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 58, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774429107.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41400.001, raw_value=41400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 28, 900601, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903582, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903609, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903624, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903635, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903645, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903655, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903667, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903676, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903692, tzinfo=datetime.timezone.utc))} (T+41403075 ms) 2026-03-25 08:58:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 57, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429047.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41340.001, raw_value=41340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 27, 878537, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 28, 902078, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905041, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905053, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905063, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905095, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905105, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 57, 30, 905124, tzinfo=datetime.timezone.utc))} (T+41403076 ms) 2026-03-25 08:59:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41463067 ms) 2026-03-25 08:59:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41463068 ms) 2026-03-25 08:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 59, 27, 878133, tzinfo=datetime.timezone.utc), raw_value=1774429167.878133, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878241, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41460.001, raw_value=41460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878453, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 28, 900406, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903449, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903502, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903512, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903528, tzinfo=datetime.timezone.utc))} (T+41463071 ms) 2026-03-25 08:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 58, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774429107.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41400.001, raw_value=41400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 28, 900601, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903582, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903609, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903624, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903635, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903645, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903655, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903667, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903676, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903692, tzinfo=datetime.timezone.utc))} (T+41463072 ms) 2026-03-25 08:59:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41463073 ms) 2026-03-25 08:59:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41463073 ms) 2026-03-25 08:59:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 59, 27, 878133, tzinfo=datetime.timezone.utc), raw_value=1774429167.878133, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878241, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41460.001, raw_value=41460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878453, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 28, 900406, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903449, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903502, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903512, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903528, tzinfo=datetime.timezone.utc))} (T+41463081 ms) 2026-03-25 08:59:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 58, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774429107.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41400.001, raw_value=41400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 28, 900601, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903582, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903609, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903624, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903635, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903645, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903655, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903667, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903676, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 58, 30, 903692, tzinfo=datetime.timezone.utc))} (T+41463082 ms) 2026-03-25 09:00:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41523069 ms) 2026-03-25 09:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41523069 ms) 2026-03-25 09:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 0, 27, 878389, tzinfo=datetime.timezone.utc), raw_value=1774429227.878389, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878516, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41520.001, raw_value=41520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878744, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 28, 902130, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905082, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905109, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905120, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905130, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905141, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905188, tzinfo=datetime.timezone.utc))} (T+41523070 ms) 2026-03-25 09:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 59, 27, 878133, tzinfo=datetime.timezone.utc), raw_value=1774429167.878133, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878241, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41460.001, raw_value=41460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878453, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 28, 900406, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903449, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903502, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903512, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903528, tzinfo=datetime.timezone.utc))} (T+41523071 ms) 2026-03-25 09:00:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41523072 ms) 2026-03-25 09:00:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41523072 ms) 2026-03-25 09:00:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 0, 27, 878389, tzinfo=datetime.timezone.utc), raw_value=1774429227.878389, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878516, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41520.001, raw_value=41520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878744, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 28, 902130, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905082, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905109, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905120, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905130, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905141, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905188, tzinfo=datetime.timezone.utc))} (T+41523072 ms) 2026-03-25 09:00:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 8, 59, 27, 878133, tzinfo=datetime.timezone.utc), raw_value=1774429167.878133, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878241, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41460.001, raw_value=41460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 27, 878453, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 28, 900406, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903449, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903502, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903512, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 8, 59, 30, 903528, tzinfo=datetime.timezone.utc))} (T+41523073 ms) 2026-03-25 09:01:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41583067 ms) 2026-03-25 09:01:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41583068 ms) 2026-03-25 09:01:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 1, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774429287.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41580.001, raw_value=41580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 28, 900465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903434, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903476, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903488, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903511, tzinfo=datetime.timezone.utc))} (T+41583068 ms) 2026-03-25 09:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 0, 27, 878389, tzinfo=datetime.timezone.utc), raw_value=1774429227.878389, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878516, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41520.001, raw_value=41520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878744, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 28, 902130, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905082, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905109, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905120, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905130, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905141, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905188, tzinfo=datetime.timezone.utc))} (T+41583069 ms) 2026-03-25 09:01:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41583070 ms) 2026-03-25 09:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41583070 ms) 2026-03-25 09:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 1, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774429287.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41580.001, raw_value=41580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 28, 900465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903434, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903476, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903488, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903511, tzinfo=datetime.timezone.utc))} (T+41583070 ms) 2026-03-25 09:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 0, 27, 878389, tzinfo=datetime.timezone.utc), raw_value=1774429227.878389, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878516, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41520.001, raw_value=41520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 27, 878744, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 28, 902130, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905082, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905109, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905120, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905130, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905141, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 0, 30, 905188, tzinfo=datetime.timezone.utc))} (T+41583071 ms) 2026-03-25 09:02:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41643068 ms) 2026-03-25 09:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41643068 ms) 2026-03-25 09:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 2, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774429347.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41640.001, raw_value=41640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 28, 900602, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903639, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903672, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903688, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903699, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903761, tzinfo=datetime.timezone.utc))} (T+41643069 ms) 2026-03-25 09:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 1, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774429287.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41580.001, raw_value=41580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 28, 900465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903434, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903476, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903488, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903511, tzinfo=datetime.timezone.utc))} (T+41643070 ms) 2026-03-25 09:02:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41643071 ms) 2026-03-25 09:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41643071 ms) 2026-03-25 09:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 2, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774429347.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41640.001, raw_value=41640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 28, 900602, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903639, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903672, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903688, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903699, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903761, tzinfo=datetime.timezone.utc))} (T+41643072 ms) 2026-03-25 09:02:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 1, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774429287.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41580.001, raw_value=41580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 28, 900465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903408, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903434, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903446, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903456, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903476, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903488, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903497, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 1, 30, 903511, tzinfo=datetime.timezone.utc))} (T+41643072 ms) 2026-03-25 09:03:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41703067 ms) 2026-03-25 09:03:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41703068 ms) 2026-03-25 09:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 3, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429407.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41700.001, raw_value=41700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 28, 900572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903622, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903650, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903661, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903671, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903682, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903692, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903703, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903729, tzinfo=datetime.timezone.utc))} (T+41703068 ms) 2026-03-25 09:03:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 2, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774429347.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41640.001, raw_value=41640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 28, 900602, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903639, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903672, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903688, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903699, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903761, tzinfo=datetime.timezone.utc))} (T+41703069 ms) 2026-03-25 09:03:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41703070 ms) 2026-03-25 09:03:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41703070 ms) 2026-03-25 09:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 3, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429407.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41700.001, raw_value=41700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 28, 900572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903622, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903650, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903661, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903671, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903682, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903692, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903703, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903729, tzinfo=datetime.timezone.utc))} (T+41703070 ms) 2026-03-25 09:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 2, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774429347.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41640.001, raw_value=41640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 28, 900602, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903639, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903672, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903688, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903699, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 2, 30, 903761, tzinfo=datetime.timezone.utc))} (T+41703071 ms) 2026-03-25 09:04:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41763067 ms) 2026-03-25 09:04:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41763068 ms) 2026-03-25 09:04:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 4, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774429467.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878257, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41760.001, raw_value=41760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 28, 900462, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903518, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903547, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903623, tzinfo=datetime.timezone.utc))} (T+41763069 ms) 2026-03-25 09:04:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 3, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429407.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41700.001, raw_value=41700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 28, 900572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903622, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903650, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903661, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903671, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903682, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903692, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903703, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903729, tzinfo=datetime.timezone.utc))} (T+41763070 ms) 2026-03-25 09:04:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41763070 ms) 2026-03-25 09:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41763070 ms) 2026-03-25 09:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 4, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774429467.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878257, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41760.001, raw_value=41760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 28, 900462, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903518, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903547, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903623, tzinfo=datetime.timezone.utc))} (T+41763071 ms) 2026-03-25 09:04:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 3, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774429407.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41700.001, raw_value=41700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 28, 900572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903622, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903650, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903661, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903671, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903682, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903692, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903703, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 3, 30, 903729, tzinfo=datetime.timezone.utc))} (T+41763072 ms) 2026-03-25 09:05:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41823068 ms) 2026-03-25 09:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41823069 ms) 2026-03-25 09:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 5, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774429527.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41820.001, raw_value=41820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904462, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904474, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904484, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904494, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904538, tzinfo=datetime.timezone.utc))} (T+41823069 ms) 2026-03-25 09:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 4, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774429467.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878257, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41760.001, raw_value=41760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 28, 900462, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903518, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903547, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903623, tzinfo=datetime.timezone.utc))} (T+41823070 ms) 2026-03-25 09:05:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41823071 ms) 2026-03-25 09:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41823071 ms) 2026-03-25 09:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 5, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774429527.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41820.001, raw_value=41820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904462, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904474, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904484, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904494, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904538, tzinfo=datetime.timezone.utc))} (T+41823072 ms) 2026-03-25 09:05:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 4, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774429467.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878257, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41760.001, raw_value=41760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 28, 900462, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903518, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903547, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903579, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 4, 30, 903623, tzinfo=datetime.timezone.utc))} (T+41823072 ms) 2026-03-25 09:06:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41883068 ms) 2026-03-25 09:06:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41883068 ms) 2026-03-25 09:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 6, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774429587.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41880.001, raw_value=41880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903892, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903906, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903927, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903948, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903957, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+41883069 ms) 2026-03-25 09:06:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 5, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774429527.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41820.001, raw_value=41820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904462, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904474, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904484, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904494, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904538, tzinfo=datetime.timezone.utc))} (T+41883070 ms) 2026-03-25 09:06:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41883070 ms) 2026-03-25 09:06:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41883071 ms) 2026-03-25 09:06:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 6, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774429587.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41880.001, raw_value=41880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903892, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903906, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903927, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903948, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903957, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+41883071 ms) 2026-03-25 09:06:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 5, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774429527.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41820.001, raw_value=41820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904462, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904474, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904484, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904494, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 5, 30, 904538, tzinfo=datetime.timezone.utc))} (T+41883072 ms) 2026-03-25 09:07:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+41943068 ms) 2026-03-25 09:07:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+41943068 ms) 2026-03-25 09:07:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 7, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774429647.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41940.001, raw_value=41940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 28, 900715, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903785, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903829, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903882, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903896, tzinfo=datetime.timezone.utc))} (T+41943069 ms) 2026-03-25 09:07:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 6, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774429587.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41880.001, raw_value=41880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903892, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903906, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903927, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903948, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903957, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+41943070 ms) 2026-03-25 09:07:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+41943071 ms) 2026-03-25 09:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+41943071 ms) 2026-03-25 09:07:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 7, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774429647.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41940.001, raw_value=41940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 28, 900715, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903785, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903829, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903882, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903896, tzinfo=datetime.timezone.utc))} (T+41943072 ms) 2026-03-25 09:07:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 6, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774429587.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41880.001, raw_value=41880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903892, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903906, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903927, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903948, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903957, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+41943072 ms) 2026-03-25 09:08:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42003067 ms) 2026-03-25 09:08:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42003068 ms) 2026-03-25 09:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 8, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774429707.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42000.001, raw_value=42000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 28, 900566, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903578, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903605, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903616, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903672, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903685, tzinfo=datetime.timezone.utc))} (T+42003069 ms) 2026-03-25 09:08:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 7, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774429647.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41940.001, raw_value=41940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 28, 900715, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903785, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903829, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903882, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903896, tzinfo=datetime.timezone.utc))} (T+42003070 ms) 2026-03-25 09:08:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42003070 ms) 2026-03-25 09:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42003071 ms) 2026-03-25 09:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 8, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774429707.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42000.001, raw_value=42000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 28, 900566, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903578, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903605, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903616, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903672, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903685, tzinfo=datetime.timezone.utc))} (T+42003071 ms) 2026-03-25 09:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 7, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774429647.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=41940.001, raw_value=41940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 28, 900715, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903785, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903816, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903829, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903882, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 7, 30, 903896, tzinfo=datetime.timezone.utc))} (T+42003072 ms) 2026-03-25 09:09:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42063068 ms) 2026-03-25 09:09:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42063068 ms) 2026-03-25 09:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 9, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774429767.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42060.001, raw_value=42060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 28, 900705, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903830, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903841, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903897, tzinfo=datetime.timezone.utc))} (T+42063069 ms) 2026-03-25 09:09:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 8, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774429707.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42000.001, raw_value=42000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 28, 900566, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903578, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903605, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903616, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903672, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903685, tzinfo=datetime.timezone.utc))} (T+42063070 ms) 2026-03-25 09:09:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42063070 ms) 2026-03-25 09:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42063071 ms) 2026-03-25 09:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 9, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774429767.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42060.001, raw_value=42060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 28, 900705, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903830, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903841, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903897, tzinfo=datetime.timezone.utc))} (T+42063071 ms) 2026-03-25 09:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 8, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774429707.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42000.001, raw_value=42000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 28, 900566, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903578, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903605, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903616, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903672, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 8, 30, 903685, tzinfo=datetime.timezone.utc))} (T+42063072 ms) 2026-03-25 09:10:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42123068 ms) 2026-03-25 09:10:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42123069 ms) 2026-03-25 09:10:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 10, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774429827.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878330, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42120.001, raw_value=42120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 28, 901287, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904264, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904293, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904307, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904338, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904360, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904373, tzinfo=datetime.timezone.utc))} (T+42123070 ms) 2026-03-25 09:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 9, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774429767.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42060.001, raw_value=42060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 28, 900705, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903830, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903841, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903897, tzinfo=datetime.timezone.utc))} (T+42123071 ms) 2026-03-25 09:10:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42123072 ms) 2026-03-25 09:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42123072 ms) 2026-03-25 09:10:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 10, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774429827.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878330, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42120.001, raw_value=42120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 28, 901287, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904264, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904293, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904307, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904338, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904360, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904373, tzinfo=datetime.timezone.utc))} (T+42123073 ms) 2026-03-25 09:10:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 9, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774429767.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42060.001, raw_value=42060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 28, 900705, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903830, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903841, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903851, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903861, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903872, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 9, 30, 903897, tzinfo=datetime.timezone.utc))} (T+42123073 ms) 2026-03-25 09:11:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42183068 ms) 2026-03-25 09:11:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42183068 ms) 2026-03-25 09:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 11, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774429887.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42180.001, raw_value=42180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 28, 900899, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903898, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903909, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903919, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903940, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903952, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903976, tzinfo=datetime.timezone.utc))} (T+42183069 ms) 2026-03-25 09:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 10, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774429827.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878330, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42120.001, raw_value=42120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 28, 901287, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904264, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904293, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904307, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904338, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904360, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904373, tzinfo=datetime.timezone.utc))} (T+42183070 ms) 2026-03-25 09:11:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42183071 ms) 2026-03-25 09:11:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42183071 ms) 2026-03-25 09:11:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 11, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774429887.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42180.001, raw_value=42180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 28, 900899, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903898, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903909, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903919, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903940, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903952, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903976, tzinfo=datetime.timezone.utc))} (T+42183072 ms) 2026-03-25 09:11:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 10, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774429827.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878330, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42120.001, raw_value=42120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 28, 901287, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904264, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904293, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904307, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904338, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904360, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 10, 30, 904373, tzinfo=datetime.timezone.utc))} (T+42183073 ms) 2026-03-25 09:12:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42243068 ms) 2026-03-25 09:12:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42243068 ms) 2026-03-25 09:12:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 12, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774429947.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42240.001, raw_value=42240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 28, 901150, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904046, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904073, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904084, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904114, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904136, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904152, tzinfo=datetime.timezone.utc))} (T+42243069 ms) 2026-03-25 09:12:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 11, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774429887.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42180.001, raw_value=42180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 28, 900899, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903898, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903909, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903919, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903940, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903952, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903976, tzinfo=datetime.timezone.utc))} (T+42243070 ms) 2026-03-25 09:12:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42243071 ms) 2026-03-25 09:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42243071 ms) 2026-03-25 09:12:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 12, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774429947.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42240.001, raw_value=42240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 28, 901150, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904046, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904073, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904084, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904114, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904136, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904152, tzinfo=datetime.timezone.utc))} (T+42243071 ms) 2026-03-25 09:12:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 11, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774429887.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42180.001, raw_value=42180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 28, 900899, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903898, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903909, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903919, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903940, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903952, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 11, 30, 903976, tzinfo=datetime.timezone.utc))} (T+42243072 ms) 2026-03-25 09:13:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42303068 ms) 2026-03-25 09:13:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42303068 ms) 2026-03-25 09:13:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 13, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430007.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42300.001, raw_value=42300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903677, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903705, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903716, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903737, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903786, tzinfo=datetime.timezone.utc))} (T+42303069 ms) 2026-03-25 09:13:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 12, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774429947.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42240.001, raw_value=42240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 28, 901150, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904046, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904073, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904084, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904114, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904136, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904152, tzinfo=datetime.timezone.utc))} (T+42303070 ms) 2026-03-25 09:13:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42303071 ms) 2026-03-25 09:13:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42303071 ms) 2026-03-25 09:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 13, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430007.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42300.001, raw_value=42300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903677, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903705, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903716, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903737, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903786, tzinfo=datetime.timezone.utc))} (T+42303072 ms) 2026-03-25 09:13:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 12, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774429947.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42240.001, raw_value=42240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 28, 901150, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904046, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904073, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904084, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904114, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904136, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 12, 30, 904152, tzinfo=datetime.timezone.utc))} (T+42303072 ms) 2026-03-25 09:14:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42363068 ms) 2026-03-25 09:14:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42363068 ms) 2026-03-25 09:14:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 14, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774430067.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42360.001, raw_value=42360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 28, 901041, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904030, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904058, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904072, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904084, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904115, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904125, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904140, tzinfo=datetime.timezone.utc))} (T+42363069 ms) 2026-03-25 09:14:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 13, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430007.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42300.001, raw_value=42300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903677, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903705, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903716, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903737, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903786, tzinfo=datetime.timezone.utc))} (T+42363070 ms) 2026-03-25 09:14:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42363071 ms) 2026-03-25 09:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42363071 ms) 2026-03-25 09:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 14, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774430067.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42360.001, raw_value=42360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 28, 901041, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904030, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904058, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904072, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904084, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904115, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904125, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904140, tzinfo=datetime.timezone.utc))} (T+42363072 ms) 2026-03-25 09:14:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 13, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430007.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42300.001, raw_value=42300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903677, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903705, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903716, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903737, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 13, 30, 903786, tzinfo=datetime.timezone.utc))} (T+42363073 ms) 2026-03-25 09:15:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42423067 ms) 2026-03-25 09:15:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42423067 ms) 2026-03-25 09:15:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 15, 27, 878209, tzinfo=datetime.timezone.utc), raw_value=1774430127.878209, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42420.001, raw_value=42420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 28, 900196, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903127, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903154, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903165, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903175, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903185, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903195, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903207, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903217, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903230, tzinfo=datetime.timezone.utc))} (T+42423068 ms) 2026-03-25 09:15:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 14, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774430067.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42360.001, raw_value=42360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 28, 901041, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904030, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904058, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904072, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904084, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904115, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904125, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904140, tzinfo=datetime.timezone.utc))} (T+42423069 ms) 2026-03-25 09:15:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42423070 ms) 2026-03-25 09:15:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42423070 ms) 2026-03-25 09:15:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 15, 27, 878209, tzinfo=datetime.timezone.utc), raw_value=1774430127.878209, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42420.001, raw_value=42420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 28, 900196, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903127, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903154, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903165, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903175, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903185, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903195, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903207, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903217, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903230, tzinfo=datetime.timezone.utc))} (T+42423070 ms) 2026-03-25 09:15:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 14, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774430067.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42360.001, raw_value=42360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 28, 901041, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904030, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904058, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904072, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904084, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904094, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904104, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904115, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904125, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 14, 30, 904140, tzinfo=datetime.timezone.utc))} (T+42423071 ms) 2026-03-25 09:16:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42483068 ms) 2026-03-25 09:16:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42483068 ms) 2026-03-25 09:16:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 16, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774430187.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42480.001, raw_value=42480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 28, 901179, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904137, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904166, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904177, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904188, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904198, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904208, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904243, tzinfo=datetime.timezone.utc))} (T+42483069 ms) 2026-03-25 09:16:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 15, 27, 878209, tzinfo=datetime.timezone.utc), raw_value=1774430127.878209, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42420.001, raw_value=42420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 28, 900196, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903127, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903154, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903165, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903175, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903185, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903195, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903207, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903217, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903230, tzinfo=datetime.timezone.utc))} (T+42483070 ms) 2026-03-25 09:16:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42483070 ms) 2026-03-25 09:16:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42483071 ms) 2026-03-25 09:16:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 16, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774430187.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42480.001, raw_value=42480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 28, 901179, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904137, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904166, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904177, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904188, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904198, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904208, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904243, tzinfo=datetime.timezone.utc))} (T+42483072 ms) 2026-03-25 09:16:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 15, 27, 878209, tzinfo=datetime.timezone.utc), raw_value=1774430127.878209, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42420.001, raw_value=42420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 28, 900196, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903127, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903154, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903165, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903175, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903185, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903195, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903207, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903217, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 15, 30, 903230, tzinfo=datetime.timezone.utc))} (T+42483073 ms) 2026-03-25 09:17:30.904 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42543065 ms) 2026-03-25 09:17:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42543066 ms) 2026-03-25 09:17:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 17, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774430247.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878239, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42540.001, raw_value=42540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 28, 900129, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901354, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901381, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901392, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901403, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901413, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901422, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901434, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901447, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901465, tzinfo=datetime.timezone.utc))} (T+42543067 ms) 2026-03-25 09:17:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 16, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774430187.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42480.001, raw_value=42480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 28, 901179, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904137, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904166, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904177, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904188, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904198, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904208, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904243, tzinfo=datetime.timezone.utc))} (T+42543068 ms) 2026-03-25 09:17:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42543068 ms) 2026-03-25 09:17:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42543068 ms) 2026-03-25 09:17:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 17, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774430247.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878239, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42540.001, raw_value=42540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 28, 900129, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901354, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901381, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901392, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901403, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901413, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901422, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901434, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901447, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901465, tzinfo=datetime.timezone.utc))} (T+42543069 ms) 2026-03-25 09:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 16, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774430187.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42480.001, raw_value=42480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 28, 901179, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904137, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904166, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904177, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904188, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904198, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904208, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 16, 30, 904243, tzinfo=datetime.timezone.utc))} (T+42543070 ms) 2026-03-25 09:18:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42603067 ms) 2026-03-25 09:18:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42603068 ms) 2026-03-25 09:18:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 18, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430307.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42600.001, raw_value=42600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903673, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903755, tzinfo=datetime.timezone.utc))} (T+42603071 ms) 2026-03-25 09:18:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 17, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774430247.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878239, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42540.001, raw_value=42540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 28, 900129, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901354, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901381, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901392, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901403, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901413, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901422, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901434, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901447, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901465, tzinfo=datetime.timezone.utc))} (T+42603072 ms) 2026-03-25 09:18:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42603073 ms) 2026-03-25 09:18:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42603073 ms) 2026-03-25 09:18:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 18, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430307.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42600.001, raw_value=42600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903673, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903755, tzinfo=datetime.timezone.utc))} (T+42603080 ms) 2026-03-25 09:18:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 17, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774430247.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878239, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42540.001, raw_value=42540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 27, 878463, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 28, 900129, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901354, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901381, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901392, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901403, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901413, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901422, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901434, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901447, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 17, 30, 901465, tzinfo=datetime.timezone.utc))} (T+42603081 ms) 2026-03-25 09:19:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42663069 ms) 2026-03-25 09:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42663070 ms) 2026-03-25 09:19:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 19, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774430367.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42660.001, raw_value=42660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 28, 902906, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905430, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905473, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905486, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905500, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905515, tzinfo=datetime.timezone.utc))} (T+42663071 ms) 2026-03-25 09:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 18, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430307.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42600.001, raw_value=42600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903673, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903755, tzinfo=datetime.timezone.utc))} (T+42663072 ms) 2026-03-25 09:19:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42663072 ms) 2026-03-25 09:19:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42663073 ms) 2026-03-25 09:19:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 19, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774430367.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42660.001, raw_value=42660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 28, 902906, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905430, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905473, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905486, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905500, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905515, tzinfo=datetime.timezone.utc))} (T+42663073 ms) 2026-03-25 09:19:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 18, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774430307.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42600.001, raw_value=42600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903673, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 18, 30, 903755, tzinfo=datetime.timezone.utc))} (T+42663074 ms) 2026-03-25 09:20:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42723067 ms) 2026-03-25 09:20:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42723068 ms) 2026-03-25 09:20:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 20, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774430427.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878231, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42720.001, raw_value=42720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 28, 900450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903389, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903411, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903443, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903453, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903469, tzinfo=datetime.timezone.utc))} (T+42723068 ms) 2026-03-25 09:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 19, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774430367.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42660.001, raw_value=42660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 28, 902906, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905430, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905473, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905486, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905500, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905515, tzinfo=datetime.timezone.utc))} (T+42723069 ms) 2026-03-25 09:20:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42723070 ms) 2026-03-25 09:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42723070 ms) 2026-03-25 09:20:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 20, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774430427.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878231, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42720.001, raw_value=42720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 28, 900450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903389, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903411, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903443, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903453, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903469, tzinfo=datetime.timezone.utc))} (T+42723070 ms) 2026-03-25 09:20:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 19, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774430367.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42660.001, raw_value=42660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 28, 902906, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905430, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905473, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905486, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905500, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 19, 30, 905515, tzinfo=datetime.timezone.utc))} (T+42723071 ms) 2026-03-25 09:21:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42783068 ms) 2026-03-25 09:21:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42783068 ms) 2026-03-25 09:21:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 21, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774430487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42780.001, raw_value=42780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878583, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 28, 900696, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903690, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903718, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903729, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903739, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903771, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903781, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903796, tzinfo=datetime.timezone.utc))} (T+42783069 ms) 2026-03-25 09:21:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 20, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774430427.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878231, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42720.001, raw_value=42720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 28, 900450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903389, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903411, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903443, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903453, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903469, tzinfo=datetime.timezone.utc))} (T+42783070 ms) 2026-03-25 09:21:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42783071 ms) 2026-03-25 09:21:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42783071 ms) 2026-03-25 09:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 21, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774430487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42780.001, raw_value=42780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878583, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 28, 900696, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903690, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903718, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903729, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903739, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903771, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903781, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903796, tzinfo=datetime.timezone.utc))} (T+42783072 ms) 2026-03-25 09:21:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 20, 27, 878123, tzinfo=datetime.timezone.utc), raw_value=1774430427.878123, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878231, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42720.001, raw_value=42720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 28, 900450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903363, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903389, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903401, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903411, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903422, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903443, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903453, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 20, 30, 903469, tzinfo=datetime.timezone.utc))} (T+42783073 ms) 2026-03-25 09:22:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42843068 ms) 2026-03-25 09:22:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42843068 ms) 2026-03-25 09:22:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 22, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774430547.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42840.001, raw_value=42840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 28, 900931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903937, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903965, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903980, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903991, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904037, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904050, tzinfo=datetime.timezone.utc))} (T+42843069 ms) 2026-03-25 09:22:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 21, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774430487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42780.001, raw_value=42780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878583, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 28, 900696, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903690, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903718, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903729, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903739, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903771, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903781, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903796, tzinfo=datetime.timezone.utc))} (T+42843070 ms) 2026-03-25 09:22:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42843071 ms) 2026-03-25 09:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42843071 ms) 2026-03-25 09:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 22, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774430547.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42840.001, raw_value=42840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 28, 900931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903937, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903965, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903980, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903991, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904037, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904050, tzinfo=datetime.timezone.utc))} (T+42843072 ms) 2026-03-25 09:22:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 21, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774430487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42780.001, raw_value=42780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 27, 878583, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 28, 900696, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903690, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903718, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903729, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903739, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903771, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903781, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 21, 30, 903796, tzinfo=datetime.timezone.utc))} (T+42843073 ms) 2026-03-25 09:23:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42903067 ms) 2026-03-25 09:23:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42903068 ms) 2026-03-25 09:23:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 23, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774430607.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42900.001, raw_value=42900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 28, 900694, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903703, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903742, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903815, tzinfo=datetime.timezone.utc))} (T+42903069 ms) 2026-03-25 09:23:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 22, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774430547.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42840.001, raw_value=42840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 28, 900931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903937, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903965, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903980, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903991, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904037, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904050, tzinfo=datetime.timezone.utc))} (T+42903070 ms) 2026-03-25 09:23:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42903070 ms) 2026-03-25 09:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42903070 ms) 2026-03-25 09:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 23, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774430607.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42900.001, raw_value=42900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 28, 900694, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903703, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903742, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903815, tzinfo=datetime.timezone.utc))} (T+42903071 ms) 2026-03-25 09:23:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 22, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774430547.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42840.001, raw_value=42840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 28, 900931, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903937, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903965, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903980, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 903991, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904037, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 22, 30, 904050, tzinfo=datetime.timezone.utc))} (T+42903072 ms) 2026-03-25 09:24:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+42963068 ms) 2026-03-25 09:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+42963068 ms) 2026-03-25 09:24:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 24, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774430667.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42960.001, raw_value=42960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 28, 901193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904152, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904181, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904192, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904222, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904234, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904243, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904256, tzinfo=datetime.timezone.utc))} (T+42963069 ms) 2026-03-25 09:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 23, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774430607.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42900.001, raw_value=42900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 28, 900694, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903703, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903742, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903815, tzinfo=datetime.timezone.utc))} (T+42963070 ms) 2026-03-25 09:24:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+42963071 ms) 2026-03-25 09:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+42963071 ms) 2026-03-25 09:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 24, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774430667.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42960.001, raw_value=42960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 28, 901193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904152, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904181, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904192, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904222, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904234, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904243, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904256, tzinfo=datetime.timezone.utc))} (T+42963072 ms) 2026-03-25 09:24:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 23, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774430607.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42900.001, raw_value=42900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 28, 900694, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903703, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903742, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903763, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 23, 30, 903815, tzinfo=datetime.timezone.utc))} (T+42963072 ms) 2026-03-25 09:25:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43023068 ms) 2026-03-25 09:25:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43023068 ms) 2026-03-25 09:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 25, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774430727.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43020.001, raw_value=43020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878546, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903891, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43023069 ms) 2026-03-25 09:25:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 24, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774430667.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42960.001, raw_value=42960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 28, 901193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904152, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904181, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904192, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904222, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904234, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904243, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904256, tzinfo=datetime.timezone.utc))} (T+43023069 ms) 2026-03-25 09:25:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43023070 ms) 2026-03-25 09:25:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43023070 ms) 2026-03-25 09:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 25, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774430727.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43020.001, raw_value=43020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878546, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903891, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43023071 ms) 2026-03-25 09:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 24, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774430667.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=42960.001, raw_value=42960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 28, 901193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904152, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904181, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904192, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904222, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904234, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904243, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 24, 30, 904256, tzinfo=datetime.timezone.utc))} (T+43023071 ms) 2026-03-25 09:26:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43083068 ms) 2026-03-25 09:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43083068 ms) 2026-03-25 09:26:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 26, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774430787.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43080.001, raw_value=43080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 28, 900651, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903832, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903879, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903890, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903901, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903911, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903935, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903952, tzinfo=datetime.timezone.utc))} (T+43083069 ms) 2026-03-25 09:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 25, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774430727.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43020.001, raw_value=43020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878546, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903891, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43083070 ms) 2026-03-25 09:26:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43083071 ms) 2026-03-25 09:26:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43083071 ms) 2026-03-25 09:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 26, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774430787.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43080.001, raw_value=43080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 28, 900651, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903832, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903879, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903890, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903901, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903911, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903935, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903952, tzinfo=datetime.timezone.utc))} (T+43083072 ms) 2026-03-25 09:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 25, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774430727.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43020.001, raw_value=43020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 27, 878546, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903891, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 25, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43083073 ms) 2026-03-25 09:27:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43143067 ms) 2026-03-25 09:27:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43143068 ms) 2026-03-25 09:27:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 27, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774430847.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43140.001, raw_value=43140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 28, 900354, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903367, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903388, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903398, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903439, tzinfo=datetime.timezone.utc))} (T+43143069 ms) 2026-03-25 09:27:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 26, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774430787.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43080.001, raw_value=43080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 28, 900651, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903832, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903879, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903890, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903901, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903911, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903935, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903952, tzinfo=datetime.timezone.utc))} (T+43143070 ms) 2026-03-25 09:27:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43143071 ms) 2026-03-25 09:27:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43143071 ms) 2026-03-25 09:27:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 27, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774430847.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43140.001, raw_value=43140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 28, 900354, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903367, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903388, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903398, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903439, tzinfo=datetime.timezone.utc))} (T+43143075 ms) 2026-03-25 09:27:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 26, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774430787.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43080.001, raw_value=43080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 28, 900651, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903832, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903879, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903890, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903901, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903911, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903935, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 26, 30, 903952, tzinfo=datetime.timezone.utc))} (T+43143075 ms) 2026-03-25 09:28:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43203068 ms) 2026-03-25 09:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43203068 ms) 2026-03-25 09:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 28, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774430907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43200.001, raw_value=43200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 28, 901009, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 903978, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904006, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904017, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904085, tzinfo=datetime.timezone.utc))} (T+43203069 ms) 2026-03-25 09:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 27, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774430847.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43140.001, raw_value=43140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 28, 900354, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903367, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903388, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903398, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903439, tzinfo=datetime.timezone.utc))} (T+43203070 ms) 2026-03-25 09:28:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43203071 ms) 2026-03-25 09:28:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43203071 ms) 2026-03-25 09:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 28, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774430907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43200.001, raw_value=43200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 28, 901009, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 903978, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904006, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904017, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904085, tzinfo=datetime.timezone.utc))} (T+43203071 ms) 2026-03-25 09:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 27, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774430847.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43140.001, raw_value=43140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 28, 900354, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903367, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903388, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903398, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 27, 30, 903439, tzinfo=datetime.timezone.utc))} (T+43203072 ms) 2026-03-25 09:29:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43263068 ms) 2026-03-25 09:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43263069 ms) 2026-03-25 09:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 29, 27, 878228, tzinfo=datetime.timezone.utc), raw_value=1774430967.878228, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43260.001, raw_value=43260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878602, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 28, 901467, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904470, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904496, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904508, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904518, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904528, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904538, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904559, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904572, tzinfo=datetime.timezone.utc))} (T+43263070 ms) 2026-03-25 09:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 28, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774430907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43200.001, raw_value=43200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 28, 901009, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 903978, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904006, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904017, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904085, tzinfo=datetime.timezone.utc))} (T+43263070 ms) 2026-03-25 09:29:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43263071 ms) 2026-03-25 09:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43263071 ms) 2026-03-25 09:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 29, 27, 878228, tzinfo=datetime.timezone.utc), raw_value=1774430967.878228, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43260.001, raw_value=43260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878602, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 28, 901467, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904470, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904496, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904508, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904518, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904528, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904538, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904559, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904572, tzinfo=datetime.timezone.utc))} (T+43263072 ms) 2026-03-25 09:29:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 28, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774430907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43200.001, raw_value=43200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 28, 901009, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 903978, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904006, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904017, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 28, 30, 904085, tzinfo=datetime.timezone.utc))} (T+43263072 ms) 2026-03-25 09:30:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43323068 ms) 2026-03-25 09:30:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43323068 ms) 2026-03-25 09:30:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 30, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774431027.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43320.001, raw_value=43320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878567, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903809, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903836, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903851, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43323069 ms) 2026-03-25 09:30:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 29, 27, 878228, tzinfo=datetime.timezone.utc), raw_value=1774430967.878228, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43260.001, raw_value=43260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878602, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 28, 901467, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904470, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904496, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904508, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904518, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904528, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904538, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904559, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904572, tzinfo=datetime.timezone.utc))} (T+43323070 ms) 2026-03-25 09:30:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43323070 ms) 2026-03-25 09:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43323070 ms) 2026-03-25 09:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 30, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774431027.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43320.001, raw_value=43320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878567, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903809, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903836, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903851, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43323071 ms) 2026-03-25 09:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 29, 27, 878228, tzinfo=datetime.timezone.utc), raw_value=1774430967.878228, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43260.001, raw_value=43260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 27, 878602, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 28, 901467, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904470, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904496, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904508, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904518, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904528, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904538, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904559, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 29, 30, 904572, tzinfo=datetime.timezone.utc))} (T+43323072 ms) 2026-03-25 09:31:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43383068 ms) 2026-03-25 09:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43383069 ms) 2026-03-25 09:31:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 31, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774431087.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43380.001, raw_value=43380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 28, 901438, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904457, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904496, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904517, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904527, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904538, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904564, tzinfo=datetime.timezone.utc))} (T+43383070 ms) 2026-03-25 09:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 30, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774431027.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43320.001, raw_value=43320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878567, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903809, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903836, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903851, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43383071 ms) 2026-03-25 09:31:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43383071 ms) 2026-03-25 09:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43383072 ms) 2026-03-25 09:31:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 31, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774431087.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43380.001, raw_value=43380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 28, 901438, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904457, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904496, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904517, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904527, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904538, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904564, tzinfo=datetime.timezone.utc))} (T+43383073 ms) 2026-03-25 09:31:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 30, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774431027.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43320.001, raw_value=43320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 27, 878567, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903809, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903836, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903851, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 30, 30, 903918, tzinfo=datetime.timezone.utc))} (T+43383074 ms) 2026-03-25 09:32:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43443067 ms) 2026-03-25 09:32:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43443068 ms) 2026-03-25 09:32:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774431147.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43440.001, raw_value=43440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903478, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903517, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903559, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903585, tzinfo=datetime.timezone.utc))} (T+43443069 ms) 2026-03-25 09:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 31, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774431087.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43380.001, raw_value=43380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 28, 901438, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904457, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904496, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904517, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904527, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904538, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904564, tzinfo=datetime.timezone.utc))} (T+43443070 ms) 2026-03-25 09:32:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43443071 ms) 2026-03-25 09:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43443071 ms) 2026-03-25 09:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774431147.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43440.001, raw_value=43440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903478, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903517, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903559, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903585, tzinfo=datetime.timezone.utc))} (T+43443072 ms) 2026-03-25 09:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 31, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774431087.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43380.001, raw_value=43380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 28, 901438, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904457, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904496, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904517, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904527, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904538, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 31, 30, 904564, tzinfo=datetime.timezone.utc))} (T+43443073 ms) 2026-03-25 09:33:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43503068 ms) 2026-03-25 09:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43503069 ms) 2026-03-25 09:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 33, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774431207.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43500.001, raw_value=43500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878731, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 28, 901321, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904294, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904321, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904333, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904343, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904353, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904363, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904375, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904385, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904400, tzinfo=datetime.timezone.utc))} (T+43503070 ms) 2026-03-25 09:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774431147.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43440.001, raw_value=43440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903478, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903517, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903559, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903585, tzinfo=datetime.timezone.utc))} (T+43503071 ms) 2026-03-25 09:33:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43503071 ms) 2026-03-25 09:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43503072 ms) 2026-03-25 09:33:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 33, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774431207.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43500.001, raw_value=43500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878731, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 28, 901321, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904294, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904321, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904333, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904343, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904353, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904363, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904375, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904385, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904400, tzinfo=datetime.timezone.utc))} (T+43503073 ms) 2026-03-25 09:33:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774431147.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43440.001, raw_value=43440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 28, 900440, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903478, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903517, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903559, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 32, 30, 903585, tzinfo=datetime.timezone.utc))} (T+43503074 ms) 2026-03-25 09:34:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43563068 ms) 2026-03-25 09:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43563069 ms) 2026-03-25 09:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 34, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774431267.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43560.001, raw_value=43560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 28, 901091, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904074, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904102, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904117, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904128, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904138, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904149, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904161, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904186, tzinfo=datetime.timezone.utc))} (T+43563070 ms) 2026-03-25 09:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 33, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774431207.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43500.001, raw_value=43500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878731, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 28, 901321, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904294, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904321, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904333, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904343, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904353, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904363, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904375, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904385, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904400, tzinfo=datetime.timezone.utc))} (T+43563071 ms) 2026-03-25 09:34:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43563071 ms) 2026-03-25 09:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43563072 ms) 2026-03-25 09:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 34, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774431267.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43560.001, raw_value=43560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 28, 901091, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904074, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904102, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904117, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904128, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904138, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904149, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904161, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904186, tzinfo=datetime.timezone.utc))} (T+43563073 ms) 2026-03-25 09:34:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 33, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774431207.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43500.001, raw_value=43500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 27, 878731, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 28, 901321, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904294, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904321, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904333, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904343, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904353, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904363, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904375, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904385, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 33, 30, 904400, tzinfo=datetime.timezone.utc))} (T+43563074 ms) 2026-03-25 09:35:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43623068 ms) 2026-03-25 09:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43623068 ms) 2026-03-25 09:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 35, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774431327.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43620.001, raw_value=43620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 28, 900995, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 903980, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904009, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904021, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904063, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904072, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904089, tzinfo=datetime.timezone.utc))} (T+43623072 ms) 2026-03-25 09:35:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 34, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774431267.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43560.001, raw_value=43560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 28, 901091, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904074, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904102, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904117, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904128, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904138, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904149, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904161, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904186, tzinfo=datetime.timezone.utc))} (T+43623073 ms) 2026-03-25 09:35:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43623073 ms) 2026-03-25 09:35:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43623073 ms) 2026-03-25 09:35:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 35, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774431327.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43620.001, raw_value=43620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 28, 900995, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 903980, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904009, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904021, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904063, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904072, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904089, tzinfo=datetime.timezone.utc))} (T+43623083 ms) 2026-03-25 09:35:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 34, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774431267.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43560.001, raw_value=43560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 28, 901091, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904074, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904102, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904117, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904128, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904138, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904149, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904161, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 34, 30, 904186, tzinfo=datetime.timezone.utc))} (T+43623083 ms) 2026-03-25 09:36:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43683067 ms) 2026-03-25 09:36:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43683068 ms) 2026-03-25 09:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 36, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774431387.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43680.001, raw_value=43680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 28, 900612, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903674, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903685, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903706, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903739, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903756, tzinfo=datetime.timezone.utc))} (T+43683069 ms) 2026-03-25 09:36:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 35, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774431327.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43620.001, raw_value=43620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 28, 900995, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 903980, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904009, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904021, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904063, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904072, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904089, tzinfo=datetime.timezone.utc))} (T+43683070 ms) 2026-03-25 09:36:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43683071 ms) 2026-03-25 09:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43683071 ms) 2026-03-25 09:36:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 36, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774431387.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43680.001, raw_value=43680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 28, 900612, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903674, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903685, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903706, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903739, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903756, tzinfo=datetime.timezone.utc))} (T+43683071 ms) 2026-03-25 09:36:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 35, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774431327.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43620.001, raw_value=43620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 28, 900995, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 903980, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904009, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904021, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904063, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904072, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 35, 30, 904089, tzinfo=datetime.timezone.utc))} (T+43683072 ms) 2026-03-25 09:37:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43743068 ms) 2026-03-25 09:37:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43743068 ms) 2026-03-25 09:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 37, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774431447.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43740.001, raw_value=43740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 28, 901195, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904155, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904216, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904260, tzinfo=datetime.timezone.utc))} (T+43743069 ms) 2026-03-25 09:37:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 36, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774431387.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43680.001, raw_value=43680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 28, 900612, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903674, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903685, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903706, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903739, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903756, tzinfo=datetime.timezone.utc))} (T+43743070 ms) 2026-03-25 09:37:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43743071 ms) 2026-03-25 09:37:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43743071 ms) 2026-03-25 09:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 37, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774431447.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43740.001, raw_value=43740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 28, 901195, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904155, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904216, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904260, tzinfo=datetime.timezone.utc))} (T+43743072 ms) 2026-03-25 09:37:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 36, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774431387.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43680.001, raw_value=43680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 28, 900612, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903646, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903674, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903685, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903706, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903739, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 36, 30, 903756, tzinfo=datetime.timezone.utc))} (T+43743072 ms) 2026-03-25 09:38:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43803067 ms) 2026-03-25 09:38:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43803068 ms) 2026-03-25 09:38:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 38, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431507.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43800.001, raw_value=43800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 28, 900661, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903637, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903679, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903711, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903722, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903732, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903745, tzinfo=datetime.timezone.utc))} (T+43803069 ms) 2026-03-25 09:38:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 37, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774431447.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43740.001, raw_value=43740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 28, 901195, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904155, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904216, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904260, tzinfo=datetime.timezone.utc))} (T+43803070 ms) 2026-03-25 09:38:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43803070 ms) 2026-03-25 09:38:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43803070 ms) 2026-03-25 09:38:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 38, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431507.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43800.001, raw_value=43800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 28, 900661, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903637, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903679, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903711, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903722, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903732, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903745, tzinfo=datetime.timezone.utc))} (T+43803071 ms) 2026-03-25 09:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 37, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774431447.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43740.001, raw_value=43740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 28, 901195, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904155, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904216, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 37, 30, 904260, tzinfo=datetime.timezone.utc))} (T+43803072 ms) 2026-03-25 09:39:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43863068 ms) 2026-03-25 09:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43863068 ms) 2026-03-25 09:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 39, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431567.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43860.001, raw_value=43860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 28, 900925, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903914, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903924, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903935, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903944, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903955, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903965, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903984, tzinfo=datetime.timezone.utc))} (T+43863069 ms) 2026-03-25 09:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 38, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431507.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43800.001, raw_value=43800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 28, 900661, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903637, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903679, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903711, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903722, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903732, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903745, tzinfo=datetime.timezone.utc))} (T+43863070 ms) 2026-03-25 09:39:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43863071 ms) 2026-03-25 09:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43863071 ms) 2026-03-25 09:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 39, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431567.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43860.001, raw_value=43860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 28, 900925, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903914, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903924, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903935, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903944, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903955, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903965, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903984, tzinfo=datetime.timezone.utc))} (T+43863071 ms) 2026-03-25 09:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 38, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431507.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43800.001, raw_value=43800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 28, 900661, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903637, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903679, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903711, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903722, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903732, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 38, 30, 903745, tzinfo=datetime.timezone.utc))} (T+43863072 ms) 2026-03-25 09:40:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43923068 ms) 2026-03-25 09:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43923068 ms) 2026-03-25 09:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 40, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774431627.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43920.001, raw_value=43920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 28, 900926, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903871, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903901, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903913, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903982, tzinfo=datetime.timezone.utc))} (T+43923069 ms) 2026-03-25 09:40:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 39, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431567.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43860.001, raw_value=43860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 28, 900925, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903914, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903924, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903935, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903944, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903955, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903965, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903984, tzinfo=datetime.timezone.utc))} (T+43923070 ms) 2026-03-25 09:40:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43923071 ms) 2026-03-25 09:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43923071 ms) 2026-03-25 09:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 40, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774431627.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43920.001, raw_value=43920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 28, 900926, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903871, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903901, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903913, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903982, tzinfo=datetime.timezone.utc))} (T+43923071 ms) 2026-03-25 09:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 39, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431567.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43860.001, raw_value=43860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 28, 900925, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903914, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903924, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903935, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903944, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903955, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903965, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 39, 30, 903984, tzinfo=datetime.timezone.utc))} (T+43923072 ms) 2026-03-25 09:41:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+43983067 ms) 2026-03-25 09:41:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+43983068 ms) 2026-03-25 09:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 41, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431687.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43980.001, raw_value=43980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 28, 900561, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903646, tzinfo=datetime.timezone.utc))} (T+43983069 ms) 2026-03-25 09:41:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 40, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774431627.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43920.001, raw_value=43920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 28, 900926, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903871, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903901, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903913, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903982, tzinfo=datetime.timezone.utc))} (T+43983069 ms) 2026-03-25 09:41:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+43983070 ms) 2026-03-25 09:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+43983070 ms) 2026-03-25 09:41:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 41, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431687.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43980.001, raw_value=43980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 28, 900561, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903646, tzinfo=datetime.timezone.utc))} (T+43983075 ms) 2026-03-25 09:41:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 40, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774431627.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43920.001, raw_value=43920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 28, 900926, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903871, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903901, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903913, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 40, 30, 903982, tzinfo=datetime.timezone.utc))} (T+43983076 ms) 2026-03-25 09:42:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44043067 ms) 2026-03-25 09:42:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44043068 ms) 2026-03-25 09:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 42, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774431747.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44040.001, raw_value=44040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 28, 900728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903707, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903748, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903800, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903816, tzinfo=datetime.timezone.utc))} (T+44043070 ms) 2026-03-25 09:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 41, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431687.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43980.001, raw_value=43980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 28, 900561, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903646, tzinfo=datetime.timezone.utc))} (T+44043070 ms) 2026-03-25 09:42:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44043071 ms) 2026-03-25 09:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44043071 ms) 2026-03-25 09:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 42, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774431747.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44040.001, raw_value=44040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 28, 900728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903707, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903748, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903800, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903816, tzinfo=datetime.timezone.utc))} (T+44043072 ms) 2026-03-25 09:42:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 41, 27, 878196, tzinfo=datetime.timezone.utc), raw_value=1774431687.878196, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=43980.001, raw_value=43980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 28, 900561, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 41, 30, 903646, tzinfo=datetime.timezone.utc))} (T+44043073 ms) 2026-03-25 09:43:30.903 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44103065 ms) 2026-03-25 09:43:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44103065 ms) 2026-03-25 09:43:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 43, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774431807.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44100.001, raw_value=44100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878465, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 28, 900217, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901345, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901355, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901365, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901375, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901389, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901415, tzinfo=datetime.timezone.utc))} (T+44103066 ms) 2026-03-25 09:43:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 42, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774431747.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44040.001, raw_value=44040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 28, 900728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903707, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903748, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903800, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903816, tzinfo=datetime.timezone.utc))} (T+44103067 ms) 2026-03-25 09:43:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44103068 ms) 2026-03-25 09:43:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44103068 ms) 2026-03-25 09:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 43, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774431807.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44100.001, raw_value=44100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878465, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 28, 900217, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901345, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901355, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901365, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901375, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901389, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901415, tzinfo=datetime.timezone.utc))} (T+44103069 ms) 2026-03-25 09:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 42, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774431747.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44040.001, raw_value=44040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 27, 878468, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 28, 900728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903707, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903734, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903748, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903800, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 42, 30, 903816, tzinfo=datetime.timezone.utc))} (T+44103070 ms) 2026-03-25 09:44:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44163067 ms) 2026-03-25 09:44:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44163067 ms) 2026-03-25 09:44:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 44, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774431867.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44160.001, raw_value=44160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878484, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 28, 900337, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903348, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903360, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903369, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903380, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903401, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903411, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903430, tzinfo=datetime.timezone.utc))} (T+44163068 ms) 2026-03-25 09:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 43, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774431807.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44100.001, raw_value=44100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878465, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 28, 900217, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901345, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901355, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901365, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901375, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901389, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901415, tzinfo=datetime.timezone.utc))} (T+44163069 ms) 2026-03-25 09:44:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44163070 ms) 2026-03-25 09:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44163070 ms) 2026-03-25 09:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 44, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774431867.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44160.001, raw_value=44160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878484, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 28, 900337, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903348, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903360, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903369, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903380, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903401, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903411, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903430, tzinfo=datetime.timezone.utc))} (T+44163070 ms) 2026-03-25 09:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 43, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774431807.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878259, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44100.001, raw_value=44100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 27, 878465, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 28, 900217, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901345, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901355, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901365, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901375, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901389, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 43, 30, 901415, tzinfo=datetime.timezone.utc))} (T+44163071 ms) 2026-03-25 09:45:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44223069 ms) 2026-03-25 09:45:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44223069 ms) 2026-03-25 09:45:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774431927.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44220.001, raw_value=44220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 28, 900605, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 903988, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904063, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904074, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904086, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904096, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904111, tzinfo=datetime.timezone.utc))} (T+44223070 ms) 2026-03-25 09:45:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 44, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774431867.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44160.001, raw_value=44160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878484, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 28, 900337, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903348, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903360, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903369, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903380, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903401, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903411, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903430, tzinfo=datetime.timezone.utc))} (T+44223071 ms) 2026-03-25 09:45:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44223072 ms) 2026-03-25 09:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44223072 ms) 2026-03-25 09:45:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774431927.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44220.001, raw_value=44220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 28, 900605, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 903988, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904063, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904074, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904086, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904096, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904111, tzinfo=datetime.timezone.utc))} (T+44223072 ms) 2026-03-25 09:45:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 44, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774431867.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44160.001, raw_value=44160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 27, 878484, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 28, 900337, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903348, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903360, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903369, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903380, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903401, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903411, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 44, 30, 903430, tzinfo=datetime.timezone.utc))} (T+44223073 ms) 2026-03-25 09:46:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44283068 ms) 2026-03-25 09:46:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44283068 ms) 2026-03-25 09:46:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 46, 27, 878219, tzinfo=datetime.timezone.utc), raw_value=1774431987.878219, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878354, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44280.001, raw_value=44280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878604, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 28, 900682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903775, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903805, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903820, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903832, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903888, tzinfo=datetime.timezone.utc))} (T+44283070 ms) 2026-03-25 09:46:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774431927.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44220.001, raw_value=44220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 28, 900605, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 903988, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904063, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904074, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904086, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904096, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904111, tzinfo=datetime.timezone.utc))} (T+44283071 ms) 2026-03-25 09:46:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44283072 ms) 2026-03-25 09:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44283072 ms) 2026-03-25 09:46:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 46, 27, 878219, tzinfo=datetime.timezone.utc), raw_value=1774431987.878219, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878354, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44280.001, raw_value=44280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878604, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 28, 900682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903775, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903805, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903820, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903832, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903888, tzinfo=datetime.timezone.utc))} (T+44283076 ms) 2026-03-25 09:46:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774431927.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44220.001, raw_value=44220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 28, 900605, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 903988, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904063, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904074, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904086, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904096, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 45, 30, 904111, tzinfo=datetime.timezone.utc))} (T+44283077 ms) 2026-03-25 09:47:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44343068 ms) 2026-03-25 09:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44343069 ms) 2026-03-25 09:47:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 47, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432047.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44340.001, raw_value=44340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878556, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 28, 901799, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904683, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904721, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904731, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904751, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904767, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904794, tzinfo=datetime.timezone.utc))} (T+44343070 ms) 2026-03-25 09:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 46, 27, 878219, tzinfo=datetime.timezone.utc), raw_value=1774431987.878219, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878354, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44280.001, raw_value=44280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878604, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 28, 900682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903775, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903805, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903820, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903832, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903888, tzinfo=datetime.timezone.utc))} (T+44343071 ms) 2026-03-25 09:47:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44343071 ms) 2026-03-25 09:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44343071 ms) 2026-03-25 09:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 47, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432047.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44340.001, raw_value=44340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878556, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 28, 901799, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904683, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904721, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904731, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904751, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904767, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904794, tzinfo=datetime.timezone.utc))} (T+44343072 ms) 2026-03-25 09:47:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 46, 27, 878219, tzinfo=datetime.timezone.utc), raw_value=1774431987.878219, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878354, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44280.001, raw_value=44280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 27, 878604, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 28, 900682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903775, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903805, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903820, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903832, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 46, 30, 903888, tzinfo=datetime.timezone.utc))} (T+44343072 ms) 2026-03-25 09:48:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44403067 ms) 2026-03-25 09:48:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44403068 ms) 2026-03-25 09:48:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 48, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774432107.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44400.001, raw_value=44400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 28, 900367, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903377, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903417, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903427, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903437, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903447, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903459, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903473, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903487, tzinfo=datetime.timezone.utc))} (T+44403069 ms) 2026-03-25 09:48:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 47, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432047.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44340.001, raw_value=44340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878556, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 28, 901799, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904683, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904721, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904731, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904751, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904767, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904794, tzinfo=datetime.timezone.utc))} (T+44403072 ms) 2026-03-25 09:48:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44403073 ms) 2026-03-25 09:48:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44403073 ms) 2026-03-25 09:48:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 48, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774432107.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44400.001, raw_value=44400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 28, 900367, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903377, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903417, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903427, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903437, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903447, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903459, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903473, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903487, tzinfo=datetime.timezone.utc))} (T+44403074 ms) 2026-03-25 09:48:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 47, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432047.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44340.001, raw_value=44340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 27, 878556, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 28, 901799, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904683, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904721, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904731, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904751, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904767, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 47, 30, 904794, tzinfo=datetime.timezone.utc))} (T+44403076 ms) 2026-03-25 09:49:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44463069 ms) 2026-03-25 09:49:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44463069 ms) 2026-03-25 09:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432167.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44460.001, raw_value=44460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 28, 900893, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903943, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903971, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903983, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904049, tzinfo=datetime.timezone.utc))} (T+44463072 ms) 2026-03-25 09:49:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 48, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774432107.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44400.001, raw_value=44400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 28, 900367, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903377, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903417, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903427, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903437, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903447, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903459, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903473, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903487, tzinfo=datetime.timezone.utc))} (T+44463072 ms) 2026-03-25 09:49:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44463073 ms) 2026-03-25 09:49:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44463073 ms) 2026-03-25 09:49:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432167.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44460.001, raw_value=44460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 28, 900893, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903943, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903971, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903983, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904049, tzinfo=datetime.timezone.utc))} (T+44463078 ms) 2026-03-25 09:49:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 48, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774432107.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44400.001, raw_value=44400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 28, 900367, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903377, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903417, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903427, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903437, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903447, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903459, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903473, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 48, 30, 903487, tzinfo=datetime.timezone.utc))} (T+44463079 ms) 2026-03-25 09:50:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44523068 ms) 2026-03-25 09:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44523069 ms) 2026-03-25 09:50:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 50, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774432227.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44520.001, raw_value=44520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 28, 900701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904104, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904117, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904155, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904187, tzinfo=datetime.timezone.utc))} (T+44523070 ms) 2026-03-25 09:50:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432167.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44460.001, raw_value=44460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 28, 900893, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903943, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903971, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903983, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904049, tzinfo=datetime.timezone.utc))} (T+44523071 ms) 2026-03-25 09:50:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44523071 ms) 2026-03-25 09:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44523072 ms) 2026-03-25 09:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 50, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774432227.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44520.001, raw_value=44520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 28, 900701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904104, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904117, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904155, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904187, tzinfo=datetime.timezone.utc))} (T+44523072 ms) 2026-03-25 09:50:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432167.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44460.001, raw_value=44460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 28, 900893, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903943, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903971, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903983, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 903993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 49, 30, 904049, tzinfo=datetime.timezone.utc))} (T+44523073 ms) 2026-03-25 09:51:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44583068 ms) 2026-03-25 09:51:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44583068 ms) 2026-03-25 09:51:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 51, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774432287.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44580.001, raw_value=44580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904181, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904208, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904220, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904240, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904267, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904277, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904290, tzinfo=datetime.timezone.utc))} (T+44583069 ms) 2026-03-25 09:51:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 50, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774432227.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44520.001, raw_value=44520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 28, 900701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904104, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904117, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904155, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904187, tzinfo=datetime.timezone.utc))} (T+44583070 ms) 2026-03-25 09:51:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44583071 ms) 2026-03-25 09:51:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44583071 ms) 2026-03-25 09:51:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 51, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774432287.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44580.001, raw_value=44580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904181, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904208, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904220, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904240, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904267, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904277, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904290, tzinfo=datetime.timezone.utc))} (T+44583072 ms) 2026-03-25 09:51:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 50, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774432227.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44520.001, raw_value=44520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 28, 900701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904104, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904117, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904155, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 50, 30, 904187, tzinfo=datetime.timezone.utc))} (T+44583072 ms) 2026-03-25 09:52:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44643068 ms) 2026-03-25 09:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44643068 ms) 2026-03-25 09:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 52, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432347.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44640.001, raw_value=44640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904035, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904063, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904075, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904105, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904145, tzinfo=datetime.timezone.utc))} (T+44643069 ms) 2026-03-25 09:52:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 51, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774432287.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44580.001, raw_value=44580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904181, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904208, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904220, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904240, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904267, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904277, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904290, tzinfo=datetime.timezone.utc))} (T+44643070 ms) 2026-03-25 09:52:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44643070 ms) 2026-03-25 09:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44643071 ms) 2026-03-25 09:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 52, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432347.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44640.001, raw_value=44640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904035, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904063, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904075, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904105, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904145, tzinfo=datetime.timezone.utc))} (T+44643071 ms) 2026-03-25 09:52:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 51, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774432287.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878311, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44580.001, raw_value=44580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904181, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904208, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904220, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904230, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904240, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904267, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904277, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 51, 30, 904290, tzinfo=datetime.timezone.utc))} (T+44643072 ms) 2026-03-25 09:53:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44703067 ms) 2026-03-25 09:53:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44703068 ms) 2026-03-25 09:53:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 53, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774432407.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44700.001, raw_value=44700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903521, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903549, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903560, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903581, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903591, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903624, tzinfo=datetime.timezone.utc))} (T+44703069 ms) 2026-03-25 09:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 52, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432347.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44640.001, raw_value=44640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904035, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904063, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904075, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904105, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904145, tzinfo=datetime.timezone.utc))} (T+44703070 ms) 2026-03-25 09:53:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44703070 ms) 2026-03-25 09:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44703070 ms) 2026-03-25 09:53:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 53, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774432407.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44700.001, raw_value=44700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903521, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903549, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903560, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903581, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903591, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903624, tzinfo=datetime.timezone.utc))} (T+44703071 ms) 2026-03-25 09:53:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 52, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432347.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44640.001, raw_value=44640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904035, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904063, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904075, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904105, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904126, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 52, 30, 904145, tzinfo=datetime.timezone.utc))} (T+44703072 ms) 2026-03-25 09:54:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44763068 ms) 2026-03-25 09:54:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44763068 ms) 2026-03-25 09:54:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 54, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432467.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44760.001, raw_value=44760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 28, 900976, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903957, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903985, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904010, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904030, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904051, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904064, tzinfo=datetime.timezone.utc))} (T+44763069 ms) 2026-03-25 09:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 53, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774432407.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44700.001, raw_value=44700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903521, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903549, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903560, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903581, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903591, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903624, tzinfo=datetime.timezone.utc))} (T+44763069 ms) 2026-03-25 09:54:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44763070 ms) 2026-03-25 09:54:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44763070 ms) 2026-03-25 09:54:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 54, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432467.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44760.001, raw_value=44760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 28, 900976, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903957, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903985, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904010, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904030, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904051, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904064, tzinfo=datetime.timezone.utc))} (T+44763071 ms) 2026-03-25 09:54:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 53, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774432407.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44700.001, raw_value=44700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903521, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903549, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903560, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903581, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903591, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903602, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903611, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 53, 30, 903624, tzinfo=datetime.timezone.utc))} (T+44763071 ms) 2026-03-25 09:55:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44823068 ms) 2026-03-25 09:55:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44823069 ms) 2026-03-25 09:55:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 55, 27, 878268, tzinfo=datetime.timezone.utc), raw_value=1774432527.878268, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44820.001, raw_value=44820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 28, 901176, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904167, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904195, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904206, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904227, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904248, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904261, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904277, tzinfo=datetime.timezone.utc))} (T+44823071 ms) 2026-03-25 09:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 54, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432467.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44760.001, raw_value=44760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 28, 900976, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903957, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903985, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904010, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904030, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904051, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904064, tzinfo=datetime.timezone.utc))} (T+44823071 ms) 2026-03-25 09:55:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44823072 ms) 2026-03-25 09:55:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44823072 ms) 2026-03-25 09:55:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 55, 27, 878268, tzinfo=datetime.timezone.utc), raw_value=1774432527.878268, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44820.001, raw_value=44820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 28, 901176, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904167, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904195, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904206, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904227, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904248, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904261, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904277, tzinfo=datetime.timezone.utc))} (T+44823076 ms) 2026-03-25 09:55:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 54, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774432467.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44760.001, raw_value=44760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 28, 900976, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903957, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903985, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 903999, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904010, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904030, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904051, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 54, 30, 904064, tzinfo=datetime.timezone.utc))} (T+44823077 ms) 2026-03-25 09:56:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44883067 ms) 2026-03-25 09:56:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44883068 ms) 2026-03-25 09:56:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 56, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432587.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44880.001, raw_value=44880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903454, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903481, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903492, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903512, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903537, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903562, tzinfo=datetime.timezone.utc))} (T+44883069 ms) 2026-03-25 09:56:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 55, 27, 878268, tzinfo=datetime.timezone.utc), raw_value=1774432527.878268, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44820.001, raw_value=44820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 28, 901176, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904167, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904195, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904206, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904227, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904248, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904261, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904277, tzinfo=datetime.timezone.utc))} (T+44883070 ms) 2026-03-25 09:56:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44883071 ms) 2026-03-25 09:56:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44883071 ms) 2026-03-25 09:56:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 56, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432587.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44880.001, raw_value=44880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903454, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903481, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903492, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903512, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903537, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903562, tzinfo=datetime.timezone.utc))} (T+44883072 ms) 2026-03-25 09:56:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 55, 27, 878268, tzinfo=datetime.timezone.utc), raw_value=1774432527.878268, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44820.001, raw_value=44820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 28, 901176, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904167, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904195, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904206, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904227, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904248, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904261, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 55, 30, 904277, tzinfo=datetime.timezone.utc))} (T+44883073 ms) 2026-03-25 09:57:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+44943067 ms) 2026-03-25 09:57:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+44943068 ms) 2026-03-25 09:57:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 57, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432647.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44940.001, raw_value=44940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 28, 900625, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903661, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903700, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903720, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903741, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903770, tzinfo=datetime.timezone.utc))} (T+44943069 ms) 2026-03-25 09:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 56, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432587.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44880.001, raw_value=44880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903454, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903481, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903492, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903512, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903537, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903562, tzinfo=datetime.timezone.utc))} (T+44943070 ms) 2026-03-25 09:57:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+44943071 ms) 2026-03-25 09:57:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+44943071 ms) 2026-03-25 09:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 57, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432647.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44940.001, raw_value=44940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 28, 900625, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903661, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903700, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903720, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903741, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903770, tzinfo=datetime.timezone.utc))} (T+44943072 ms) 2026-03-25 09:57:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 56, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774432587.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44880.001, raw_value=44880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903454, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903481, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903492, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903512, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903537, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 56, 30, 903562, tzinfo=datetime.timezone.utc))} (T+44943073 ms) 2026-03-25 09:58:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45003067 ms) 2026-03-25 09:58:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45003068 ms) 2026-03-25 09:58:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 58, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774432707.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45000.001, raw_value=45000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903426, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903441, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903472, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903483, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903493, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903509, tzinfo=datetime.timezone.utc))} (T+45003069 ms) 2026-03-25 09:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 57, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432647.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44940.001, raw_value=44940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 28, 900625, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903661, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903700, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903720, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903741, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903770, tzinfo=datetime.timezone.utc))} (T+45003069 ms) 2026-03-25 09:58:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45003070 ms) 2026-03-25 09:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45003070 ms) 2026-03-25 09:58:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 58, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774432707.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45000.001, raw_value=45000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903426, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903441, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903472, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903483, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903493, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903509, tzinfo=datetime.timezone.utc))} (T+45003077 ms) 2026-03-25 09:58:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 57, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774432647.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=44940.001, raw_value=44940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 28, 900625, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903661, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903700, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903710, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903720, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903741, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 57, 30, 903770, tzinfo=datetime.timezone.utc))} (T+45003078 ms) 2026-03-25 09:59:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45063068 ms) 2026-03-25 09:59:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45063069 ms) 2026-03-25 09:59:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 59, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774432767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45060.001, raw_value=45060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 28, 901037, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904070, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904107, tzinfo=datetime.timezone.utc))} (T+45063071 ms) 2026-03-25 09:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 58, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774432707.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45000.001, raw_value=45000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903426, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903441, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903472, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903483, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903493, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903509, tzinfo=datetime.timezone.utc))} (T+45063072 ms) 2026-03-25 09:59:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45063073 ms) 2026-03-25 09:59:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45063073 ms) 2026-03-25 09:59:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 59, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774432767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45060.001, raw_value=45060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 28, 901037, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904070, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904107, tzinfo=datetime.timezone.utc))} (T+45063077 ms) 2026-03-25 09:59:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 58, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774432707.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45000.001, raw_value=45000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903398, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903426, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903441, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903463, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903472, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903483, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903493, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 58, 30, 903509, tzinfo=datetime.timezone.utc))} (T+45063078 ms) 2026-03-25 10:00:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45123067 ms) 2026-03-25 10:00:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45123068 ms) 2026-03-25 10:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 0, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774432827.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45120.001, raw_value=45120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903833, tzinfo=datetime.timezone.utc))} (T+45123069 ms) 2026-03-25 10:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 59, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774432767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45060.001, raw_value=45060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 28, 901037, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904070, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904107, tzinfo=datetime.timezone.utc))} (T+45123070 ms) 2026-03-25 10:00:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45123071 ms) 2026-03-25 10:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45123071 ms) 2026-03-25 10:00:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 0, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774432827.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45120.001, raw_value=45120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903833, tzinfo=datetime.timezone.utc))} (T+45123072 ms) 2026-03-25 10:00:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 9, 59, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774432767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45060.001, raw_value=45060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 28, 901037, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904070, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 9, 59, 30, 904107, tzinfo=datetime.timezone.utc))} (T+45123073 ms) 2026-03-25 10:01:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45183068 ms) 2026-03-25 10:01:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45183068 ms) 2026-03-25 10:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 1, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774432887.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45180.001, raw_value=45180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 28, 901017, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 903977, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904005, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904016, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904087, tzinfo=datetime.timezone.utc))} (T+45183069 ms) 2026-03-25 10:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 0, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774432827.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45120.001, raw_value=45120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903833, tzinfo=datetime.timezone.utc))} (T+45183070 ms) 2026-03-25 10:01:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45183071 ms) 2026-03-25 10:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45183071 ms) 2026-03-25 10:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 1, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774432887.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45180.001, raw_value=45180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 28, 901017, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 903977, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904005, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904016, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904087, tzinfo=datetime.timezone.utc))} (T+45183072 ms) 2026-03-25 10:01:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 0, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774432827.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45120.001, raw_value=45120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 28, 900751, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 0, 30, 903833, tzinfo=datetime.timezone.utc))} (T+45183072 ms) 2026-03-25 10:02:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45243068 ms) 2026-03-25 10:02:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45243068 ms) 2026-03-25 10:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774432947.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45240.001, raw_value=45240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 28, 900527, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903604, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903632, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903647, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903658, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903714, tzinfo=datetime.timezone.utc))} (T+45243069 ms) 2026-03-25 10:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 1, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774432887.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45180.001, raw_value=45180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 28, 901017, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 903977, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904005, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904016, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904087, tzinfo=datetime.timezone.utc))} (T+45243070 ms) 2026-03-25 10:02:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45243070 ms) 2026-03-25 10:02:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45243071 ms) 2026-03-25 10:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774432947.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45240.001, raw_value=45240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 28, 900527, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903604, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903632, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903647, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903658, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903714, tzinfo=datetime.timezone.utc))} (T+45243071 ms) 2026-03-25 10:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 1, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774432887.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45180.001, raw_value=45180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 28, 901017, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 903977, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904005, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904016, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904027, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904048, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904069, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 1, 30, 904087, tzinfo=datetime.timezone.utc))} (T+45243072 ms) 2026-03-25 10:03:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45303068 ms) 2026-03-25 10:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45303069 ms) 2026-03-25 10:03:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 3, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774433007.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45300.001, raw_value=45300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 28, 901474, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904460, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904491, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904502, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904522, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904532, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904570, tzinfo=datetime.timezone.utc))} (T+45303070 ms) 2026-03-25 10:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774432947.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45240.001, raw_value=45240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 28, 900527, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903604, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903632, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903647, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903658, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903714, tzinfo=datetime.timezone.utc))} (T+45303071 ms) 2026-03-25 10:03:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45303071 ms) 2026-03-25 10:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45303072 ms) 2026-03-25 10:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 3, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774433007.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45300.001, raw_value=45300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 28, 901474, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904460, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904491, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904502, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904522, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904532, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904570, tzinfo=datetime.timezone.utc))} (T+45303072 ms) 2026-03-25 10:03:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774432947.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45240.001, raw_value=45240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 28, 900527, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903604, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903632, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903647, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903658, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 2, 30, 903714, tzinfo=datetime.timezone.utc))} (T+45303073 ms) 2026-03-25 10:04:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45363068 ms) 2026-03-25 10:04:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45363069 ms) 2026-03-25 10:04:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 4, 27, 878376, tzinfo=datetime.timezone.utc), raw_value=1774433067.878376, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878523, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45360.001, raw_value=45360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878778, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 28, 901309, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904255, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904282, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904336, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904346, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904362, tzinfo=datetime.timezone.utc))} (T+45363069 ms) 2026-03-25 10:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 3, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774433007.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45300.001, raw_value=45300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 28, 901474, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904460, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904491, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904502, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904522, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904532, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904570, tzinfo=datetime.timezone.utc))} (T+45363070 ms) 2026-03-25 10:04:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45363071 ms) 2026-03-25 10:04:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45363071 ms) 2026-03-25 10:04:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 4, 27, 878376, tzinfo=datetime.timezone.utc), raw_value=1774433067.878376, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878523, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45360.001, raw_value=45360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878778, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 28, 901309, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904255, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904282, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904336, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904346, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904362, tzinfo=datetime.timezone.utc))} (T+45363072 ms) 2026-03-25 10:04:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 3, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774433007.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45300.001, raw_value=45300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 28, 901474, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904460, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904491, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904502, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904522, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904532, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 3, 30, 904570, tzinfo=datetime.timezone.utc))} (T+45363072 ms) 2026-03-25 10:05:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45423067 ms) 2026-03-25 10:05:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45423068 ms) 2026-03-25 10:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 5, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774433127.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45420.001, raw_value=45420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 28, 900460, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903492, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903503, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903513, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903524, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903544, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903571, tzinfo=datetime.timezone.utc))} (T+45423069 ms) 2026-03-25 10:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 4, 27, 878376, tzinfo=datetime.timezone.utc), raw_value=1774433067.878376, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878523, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45360.001, raw_value=45360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878778, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 28, 901309, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904255, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904282, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904336, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904346, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904362, tzinfo=datetime.timezone.utc))} (T+45423069 ms) 2026-03-25 10:05:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45423070 ms) 2026-03-25 10:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45423070 ms) 2026-03-25 10:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 5, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774433127.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45420.001, raw_value=45420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 28, 900460, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903492, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903503, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903513, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903524, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903544, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903571, tzinfo=datetime.timezone.utc))} (T+45423071 ms) 2026-03-25 10:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 4, 27, 878376, tzinfo=datetime.timezone.utc), raw_value=1774433067.878376, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878523, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45360.001, raw_value=45360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 27, 878778, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 28, 901309, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904255, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904282, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904336, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904346, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 4, 30, 904362, tzinfo=datetime.timezone.utc))} (T+45423071 ms) 2026-03-25 10:06:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45483068 ms) 2026-03-25 10:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45483068 ms) 2026-03-25 10:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 6, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774433187.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45480.001, raw_value=45480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 28, 900897, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903893, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903907, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903918, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903928, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+45483069 ms) 2026-03-25 10:06:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 5, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774433127.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45420.001, raw_value=45420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 28, 900460, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903492, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903503, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903513, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903524, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903544, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903571, tzinfo=datetime.timezone.utc))} (T+45483069 ms) 2026-03-25 10:06:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45483070 ms) 2026-03-25 10:06:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45483070 ms) 2026-03-25 10:06:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 6, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774433187.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45480.001, raw_value=45480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 28, 900897, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903893, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903907, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903918, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903928, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+45483070 ms) 2026-03-25 10:06:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 5, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774433127.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45420.001, raw_value=45420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 28, 900460, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903492, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903503, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903513, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903524, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903544, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 5, 30, 903571, tzinfo=datetime.timezone.utc))} (T+45483071 ms) 2026-03-25 10:07:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45543067 ms) 2026-03-25 10:07:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45543068 ms) 2026-03-25 10:07:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 7, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774433247.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45540.001, raw_value=45540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 28, 900569, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903574, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903613, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903655, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903685, tzinfo=datetime.timezone.utc))} (T+45543069 ms) 2026-03-25 10:07:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 6, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774433187.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45480.001, raw_value=45480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 28, 900897, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903893, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903907, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903918, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903928, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+45543069 ms) 2026-03-25 10:07:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45543070 ms) 2026-03-25 10:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45543070 ms) 2026-03-25 10:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 7, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774433247.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45540.001, raw_value=45540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 28, 900569, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903574, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903613, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903655, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903685, tzinfo=datetime.timezone.utc))} (T+45543071 ms) 2026-03-25 10:07:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 6, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774433187.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45480.001, raw_value=45480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 28, 900897, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903865, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903893, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903907, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903918, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903928, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903959, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 6, 30, 903973, tzinfo=datetime.timezone.utc))} (T+45543072 ms) 2026-03-25 10:08:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45603067 ms) 2026-03-25 10:08:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45603068 ms) 2026-03-25 10:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 8, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774433307.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45600.001, raw_value=45600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 28, 900278, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903216, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903244, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903255, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903276, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903297, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903311, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903330, tzinfo=datetime.timezone.utc))} (T+45603069 ms) 2026-03-25 10:08:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 7, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774433247.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45540.001, raw_value=45540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 28, 900569, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903574, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903613, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903655, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903685, tzinfo=datetime.timezone.utc))} (T+45603069 ms) 2026-03-25 10:08:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45603070 ms) 2026-03-25 10:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45603070 ms) 2026-03-25 10:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 8, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774433307.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45600.001, raw_value=45600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 28, 900278, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903216, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903244, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903255, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903276, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903297, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903311, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903330, tzinfo=datetime.timezone.utc))} (T+45603072 ms) 2026-03-25 10:08:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 7, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774433247.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45540.001, raw_value=45540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 28, 900569, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903574, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903613, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903655, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 7, 30, 903685, tzinfo=datetime.timezone.utc))} (T+45603072 ms) 2026-03-25 10:09:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45663068 ms) 2026-03-25 10:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45663068 ms) 2026-03-25 10:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 9, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774433367.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45660.001, raw_value=45660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903745, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903852, tzinfo=datetime.timezone.utc))} (T+45663069 ms) 2026-03-25 10:09:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 8, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774433307.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45600.001, raw_value=45600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 28, 900278, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903216, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903244, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903255, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903276, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903297, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903311, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903330, tzinfo=datetime.timezone.utc))} (T+45663070 ms) 2026-03-25 10:09:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45663071 ms) 2026-03-25 10:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45663071 ms) 2026-03-25 10:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 9, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774433367.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45660.001, raw_value=45660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903745, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903852, tzinfo=datetime.timezone.utc))} (T+45663072 ms) 2026-03-25 10:09:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 8, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774433307.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45600.001, raw_value=45600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 28, 900278, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903216, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903244, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903255, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903276, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903297, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903311, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 8, 30, 903330, tzinfo=datetime.timezone.utc))} (T+45663073 ms) 2026-03-25 10:10:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45723067 ms) 2026-03-25 10:10:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45723068 ms) 2026-03-25 10:10:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 10, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774433427.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45720.001, raw_value=45720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 28, 900455, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903494, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903537, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903604, tzinfo=datetime.timezone.utc))} (T+45723069 ms) 2026-03-25 10:10:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 9, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774433367.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45660.001, raw_value=45660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903745, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903852, tzinfo=datetime.timezone.utc))} (T+45723070 ms) 2026-03-25 10:10:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45723071 ms) 2026-03-25 10:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45723071 ms) 2026-03-25 10:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 10, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774433427.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45720.001, raw_value=45720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 28, 900455, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903494, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903537, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903604, tzinfo=datetime.timezone.utc))} (T+45723071 ms) 2026-03-25 10:10:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 9, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774433367.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45660.001, raw_value=45660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903745, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 9, 30, 903852, tzinfo=datetime.timezone.utc))} (T+45723072 ms) 2026-03-25 10:11:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45783067 ms) 2026-03-25 10:11:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45783068 ms) 2026-03-25 10:11:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 11, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774433487.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45780.001, raw_value=45780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 28, 900344, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903340, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903379, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903424, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903435, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903450, tzinfo=datetime.timezone.utc))} (T+45783068 ms) 2026-03-25 10:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 10, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774433427.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45720.001, raw_value=45720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 28, 900455, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903494, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903537, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903604, tzinfo=datetime.timezone.utc))} (T+45783069 ms) 2026-03-25 10:11:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45783070 ms) 2026-03-25 10:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45783070 ms) 2026-03-25 10:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 11, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774433487.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45780.001, raw_value=45780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 28, 900344, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903340, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903379, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903424, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903435, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903450, tzinfo=datetime.timezone.utc))} (T+45783071 ms) 2026-03-25 10:11:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 10, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774433427.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45720.001, raw_value=45720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 27, 878568, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 28, 900455, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903494, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903537, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903568, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 10, 30, 903604, tzinfo=datetime.timezone.utc))} (T+45783071 ms) 2026-03-25 10:12:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45843068 ms) 2026-03-25 10:12:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45843068 ms) 2026-03-25 10:12:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774433547.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45840.001, raw_value=45840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904026, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904054, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904065, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904129, tzinfo=datetime.timezone.utc))} (T+45843069 ms) 2026-03-25 10:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 11, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774433487.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45780.001, raw_value=45780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 28, 900344, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903340, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903379, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903424, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903435, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903450, tzinfo=datetime.timezone.utc))} (T+45843070 ms) 2026-03-25 10:12:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45843071 ms) 2026-03-25 10:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45843071 ms) 2026-03-25 10:12:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774433547.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45840.001, raw_value=45840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904026, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904054, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904065, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904129, tzinfo=datetime.timezone.utc))} (T+45843072 ms) 2026-03-25 10:12:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 11, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774433487.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45780.001, raw_value=45780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 28, 900344, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903340, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903379, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903424, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903435, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 11, 30, 903450, tzinfo=datetime.timezone.utc))} (T+45843072 ms) 2026-03-25 10:13:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45903068 ms) 2026-03-25 10:13:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45903069 ms) 2026-03-25 10:13:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 13, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774433607.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45900.001, raw_value=45900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 28, 901776, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904755, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904767, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904777, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904788, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904809, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904832, tzinfo=datetime.timezone.utc))} (T+45903070 ms) 2026-03-25 10:13:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774433547.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45840.001, raw_value=45840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904026, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904054, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904065, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904129, tzinfo=datetime.timezone.utc))} (T+45903071 ms) 2026-03-25 10:13:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45903071 ms) 2026-03-25 10:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45903072 ms) 2026-03-25 10:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 13, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774433607.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45900.001, raw_value=45900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 28, 901776, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904755, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904767, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904777, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904788, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904809, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904832, tzinfo=datetime.timezone.utc))} (T+45903072 ms) 2026-03-25 10:13:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774433547.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45840.001, raw_value=45840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 28, 901076, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904026, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904054, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904065, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 12, 30, 904129, tzinfo=datetime.timezone.utc))} (T+45903073 ms) 2026-03-25 10:14:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+45963068 ms) 2026-03-25 10:14:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+45963068 ms) 2026-03-25 10:14:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 14, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433667.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45960.001, raw_value=45960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903701, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903729, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903743, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903796, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903812, tzinfo=datetime.timezone.utc))} (T+45963069 ms) 2026-03-25 10:14:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 13, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774433607.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45900.001, raw_value=45900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 28, 901776, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904755, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904767, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904777, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904788, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904809, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904832, tzinfo=datetime.timezone.utc))} (T+45963070 ms) 2026-03-25 10:14:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+45963071 ms) 2026-03-25 10:14:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+45963071 ms) 2026-03-25 10:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 14, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433667.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45960.001, raw_value=45960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903701, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903729, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903743, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903796, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903812, tzinfo=datetime.timezone.utc))} (T+45963071 ms) 2026-03-25 10:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 13, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774433607.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878291, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45900.001, raw_value=45900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 28, 901776, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904755, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904767, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904777, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904788, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904809, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 13, 30, 904832, tzinfo=datetime.timezone.utc))} (T+45963072 ms) 2026-03-25 10:15:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46023068 ms) 2026-03-25 10:15:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46023068 ms) 2026-03-25 10:15:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46020.001, raw_value=46020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 28, 901181, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904134, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904162, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904173, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904194, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904242, tzinfo=datetime.timezone.utc))} (T+46023069 ms) 2026-03-25 10:15:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 14, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433667.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45960.001, raw_value=45960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903701, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903729, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903743, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903796, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903812, tzinfo=datetime.timezone.utc))} (T+46023070 ms) 2026-03-25 10:15:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46023071 ms) 2026-03-25 10:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46023071 ms) 2026-03-25 10:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46020.001, raw_value=46020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 28, 901181, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904134, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904162, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904173, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904194, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904242, tzinfo=datetime.timezone.utc))} (T+46023072 ms) 2026-03-25 10:15:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 14, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433667.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=45960.001, raw_value=45960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903701, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903729, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903743, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903796, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 14, 30, 903812, tzinfo=datetime.timezone.utc))} (T+46023073 ms) 2026-03-25 10:16:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46083068 ms) 2026-03-25 10:16:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46083068 ms) 2026-03-25 10:16:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 16, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774433787.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46080.001, raw_value=46080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 28, 900720, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903747, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903777, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903789, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903800, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903810, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903820, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903857, tzinfo=datetime.timezone.utc))} (T+46083070 ms) 2026-03-25 10:16:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46020.001, raw_value=46020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 28, 901181, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904134, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904162, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904173, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904194, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904242, tzinfo=datetime.timezone.utc))} (T+46083071 ms) 2026-03-25 10:16:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46083072 ms) 2026-03-25 10:16:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46083072 ms) 2026-03-25 10:16:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 16, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774433787.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46080.001, raw_value=46080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 28, 900720, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903747, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903777, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903789, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903800, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903810, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903820, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903857, tzinfo=datetime.timezone.utc))} (T+46083075 ms) 2026-03-25 10:16:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774433727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46020.001, raw_value=46020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 28, 901181, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904134, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904162, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904173, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904194, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904219, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 15, 30, 904242, tzinfo=datetime.timezone.utc))} (T+46083076 ms) 2026-03-25 10:17:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46143067 ms) 2026-03-25 10:17:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46143068 ms) 2026-03-25 10:17:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 17, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774433847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46140.001, raw_value=46140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 28, 900246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903232, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903271, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903281, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903291, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903302, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903326, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903343, tzinfo=datetime.timezone.utc))} (T+46143069 ms) 2026-03-25 10:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 16, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774433787.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46080.001, raw_value=46080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 28, 900720, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903747, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903777, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903789, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903800, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903810, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903820, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903857, tzinfo=datetime.timezone.utc))} (T+46143069 ms) 2026-03-25 10:17:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46143070 ms) 2026-03-25 10:17:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46143070 ms) 2026-03-25 10:17:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 17, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774433847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46140.001, raw_value=46140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 28, 900246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903232, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903271, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903281, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903291, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903302, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903326, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903343, tzinfo=datetime.timezone.utc))} (T+46143076 ms) 2026-03-25 10:17:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 16, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774433787.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46080.001, raw_value=46080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 28, 900720, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903747, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903777, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903789, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903800, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903810, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903820, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 16, 30, 903857, tzinfo=datetime.timezone.utc))} (T+46143077 ms) 2026-03-25 10:18:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46203068 ms) 2026-03-25 10:18:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46203068 ms) 2026-03-25 10:18:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 18, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774433907.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46200.001, raw_value=46200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903912, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903940, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903955, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903966, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903976, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903987, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903998, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904023, tzinfo=datetime.timezone.utc))} (T+46203072 ms) 2026-03-25 10:18:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 17, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774433847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46140.001, raw_value=46140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 28, 900246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903232, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903271, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903281, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903291, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903302, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903326, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903343, tzinfo=datetime.timezone.utc))} (T+46203073 ms) 2026-03-25 10:18:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46203073 ms) 2026-03-25 10:18:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46203074 ms) 2026-03-25 10:18:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 18, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774433907.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46200.001, raw_value=46200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903912, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903940, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903955, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903966, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903976, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903987, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903998, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904023, tzinfo=datetime.timezone.utc))} (T+46203081 ms) 2026-03-25 10:18:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 17, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774433847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46140.001, raw_value=46140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 28, 900246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903232, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903259, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903271, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903281, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903291, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903302, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903326, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 17, 30, 903343, tzinfo=datetime.timezone.utc))} (T+46203082 ms) 2026-03-25 10:19:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46263067 ms) 2026-03-25 10:19:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46263068 ms) 2026-03-25 10:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 19, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774433967.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46260.001, raw_value=46260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 28, 900613, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903624, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903651, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903663, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903673, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903734, tzinfo=datetime.timezone.utc))} (T+46263069 ms) 2026-03-25 10:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 18, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774433907.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46200.001, raw_value=46200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903912, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903940, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903955, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903966, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903976, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903987, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903998, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904023, tzinfo=datetime.timezone.utc))} (T+46263070 ms) 2026-03-25 10:19:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46263073 ms) 2026-03-25 10:19:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46263073 ms) 2026-03-25 10:19:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 19, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774433967.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46260.001, raw_value=46260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 28, 900613, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903624, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903651, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903663, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903673, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903734, tzinfo=datetime.timezone.utc))} (T+46263079 ms) 2026-03-25 10:19:30.918 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 18, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774433907.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46200.001, raw_value=46200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 27, 878575, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903912, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903940, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903955, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903966, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903976, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903987, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 903998, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 18, 30, 904023, tzinfo=datetime.timezone.utc))} (T+46263080 ms) 2026-03-25 10:20:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46323067 ms) 2026-03-25 10:20:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46323068 ms) 2026-03-25 10:20:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 20, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774434027.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46320.001, raw_value=46320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 28, 900473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903484, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903512, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903545, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903555, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903570, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903581, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903600, tzinfo=datetime.timezone.utc))} (T+46323069 ms) 2026-03-25 10:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 19, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774433967.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46260.001, raw_value=46260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 28, 900613, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903624, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903651, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903663, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903673, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903734, tzinfo=datetime.timezone.utc))} (T+46323070 ms) 2026-03-25 10:20:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46323070 ms) 2026-03-25 10:20:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46323070 ms) 2026-03-25 10:20:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 20, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774434027.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46320.001, raw_value=46320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 28, 900473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903484, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903512, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903545, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903555, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903570, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903581, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903600, tzinfo=datetime.timezone.utc))} (T+46323078 ms) 2026-03-25 10:20:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 19, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774433967.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46260.001, raw_value=46260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 28, 900613, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903624, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903651, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903663, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903673, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 19, 30, 903734, tzinfo=datetime.timezone.utc))} (T+46323079 ms) 2026-03-25 10:21:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46383067 ms) 2026-03-25 10:21:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46383068 ms) 2026-03-25 10:21:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 21, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774434087.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46380.001, raw_value=46380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 28, 900288, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903330, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903351, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903367, tzinfo=datetime.timezone.utc))} (T+46383070 ms) 2026-03-25 10:21:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 20, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774434027.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46320.001, raw_value=46320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 28, 900473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903484, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903512, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903545, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903555, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903570, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903581, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903600, tzinfo=datetime.timezone.utc))} (T+46383071 ms) 2026-03-25 10:21:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46383071 ms) 2026-03-25 10:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46383072 ms) 2026-03-25 10:21:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 21, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774434087.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46380.001, raw_value=46380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 28, 900288, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903330, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903351, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903367, tzinfo=datetime.timezone.utc))} (T+46383076 ms) 2026-03-25 10:21:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 20, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774434027.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46320.001, raw_value=46320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 28, 900473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903484, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903512, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903545, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903555, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903570, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903581, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 20, 30, 903600, tzinfo=datetime.timezone.utc))} (T+46383076 ms) 2026-03-25 10:22:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46443067 ms) 2026-03-25 10:22:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46443068 ms) 2026-03-25 10:22:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 22, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774434147.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46440.001, raw_value=46440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903567, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903605, tzinfo=datetime.timezone.utc))} (T+46443069 ms) 2026-03-25 10:22:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 21, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774434087.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46380.001, raw_value=46380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 28, 900288, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903330, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903351, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903367, tzinfo=datetime.timezone.utc))} (T+46443069 ms) 2026-03-25 10:22:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46443070 ms) 2026-03-25 10:22:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46443070 ms) 2026-03-25 10:22:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 22, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774434147.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46440.001, raw_value=46440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903567, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903605, tzinfo=datetime.timezone.utc))} (T+46443072 ms) 2026-03-25 10:22:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 21, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774434087.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46380.001, raw_value=46380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 28, 900288, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903330, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903351, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 21, 30, 903367, tzinfo=datetime.timezone.utc))} (T+46443073 ms) 2026-03-25 10:23:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46503070 ms) 2026-03-25 10:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46503071 ms) 2026-03-25 10:23:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 23, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774434207.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46500.001, raw_value=46500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 28, 900475, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905725, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905749, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905759, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905769, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905785, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905797, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905813, tzinfo=datetime.timezone.utc))} (T+46503072 ms) 2026-03-25 10:23:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 22, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774434147.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46440.001, raw_value=46440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903567, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903605, tzinfo=datetime.timezone.utc))} (T+46503073 ms) 2026-03-25 10:23:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46503074 ms) 2026-03-25 10:23:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46503074 ms) 2026-03-25 10:23:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 23, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774434207.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46500.001, raw_value=46500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 28, 900475, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905725, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905749, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905759, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905769, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905785, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905797, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905813, tzinfo=datetime.timezone.utc))} (T+46503075 ms) 2026-03-25 10:23:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 22, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774434147.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46440.001, raw_value=46440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903567, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903589, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 22, 30, 903605, tzinfo=datetime.timezone.utc))} (T+46503076 ms) 2026-03-25 10:24:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46563067 ms) 2026-03-25 10:24:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46563068 ms) 2026-03-25 10:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 24, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774434267.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46560.001, raw_value=46560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903480, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903586, tzinfo=datetime.timezone.utc))} (T+46563069 ms) 2026-03-25 10:24:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 23, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774434207.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46500.001, raw_value=46500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 28, 900475, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905725, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905749, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905759, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905769, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905785, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905797, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905813, tzinfo=datetime.timezone.utc))} (T+46563070 ms) 2026-03-25 10:24:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46563070 ms) 2026-03-25 10:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46563070 ms) 2026-03-25 10:24:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 24, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774434267.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46560.001, raw_value=46560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903480, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903586, tzinfo=datetime.timezone.utc))} (T+46563077 ms) 2026-03-25 10:24:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 23, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774434207.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46500.001, raw_value=46500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 28, 900475, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905725, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905749, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905759, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905769, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905785, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905797, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 23, 30, 905813, tzinfo=datetime.timezone.utc))} (T+46563078 ms) 2026-03-25 10:25:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46623067 ms) 2026-03-25 10:25:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46623068 ms) 2026-03-25 10:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 25, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774434327.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46620.001, raw_value=46620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 28, 900768, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903771, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903783, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903847, tzinfo=datetime.timezone.utc))} (T+46623069 ms) 2026-03-25 10:25:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 24, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774434267.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46560.001, raw_value=46560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903480, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903586, tzinfo=datetime.timezone.utc))} (T+46623070 ms) 2026-03-25 10:25:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46623070 ms) 2026-03-25 10:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46623071 ms) 2026-03-25 10:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 25, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774434327.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46620.001, raw_value=46620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 28, 900768, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903771, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903783, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903847, tzinfo=datetime.timezone.utc))} (T+46623072 ms) 2026-03-25 10:25:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 24, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774434267.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46560.001, raw_value=46560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903480, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 24, 30, 903586, tzinfo=datetime.timezone.utc))} (T+46623072 ms) 2026-03-25 10:26:30.904 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46683066 ms) 2026-03-25 10:26:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46683066 ms) 2026-03-25 10:26:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 26, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774434387.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46680.001, raw_value=46680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 28, 899348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902253, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902280, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902355, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902368, tzinfo=datetime.timezone.utc))} (T+46683067 ms) 2026-03-25 10:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 25, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774434327.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46620.001, raw_value=46620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 28, 900768, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903771, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903783, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903847, tzinfo=datetime.timezone.utc))} (T+46683068 ms) 2026-03-25 10:26:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46683069 ms) 2026-03-25 10:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46683069 ms) 2026-03-25 10:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 26, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774434387.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46680.001, raw_value=46680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 28, 899348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902253, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902280, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902355, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902368, tzinfo=datetime.timezone.utc))} (T+46683070 ms) 2026-03-25 10:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 25, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774434327.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46620.001, raw_value=46620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 28, 900768, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903771, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903783, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 25, 30, 903847, tzinfo=datetime.timezone.utc))} (T+46683071 ms) 2026-03-25 10:27:30.904 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46743066 ms) 2026-03-25 10:27:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46743066 ms) 2026-03-25 10:27:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 27, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774434447.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46740.001, raw_value=46740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 28, 900547, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901902, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901928, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901939, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901949, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901959, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901986, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901996, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 902009, tzinfo=datetime.timezone.utc))} (T+46743067 ms) 2026-03-25 10:27:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 26, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774434387.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46680.001, raw_value=46680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 28, 899348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902253, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902280, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902355, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902368, tzinfo=datetime.timezone.utc))} (T+46743068 ms) 2026-03-25 10:27:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46743069 ms) 2026-03-25 10:27:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46743069 ms) 2026-03-25 10:27:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 27, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774434447.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46740.001, raw_value=46740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 28, 900547, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901902, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901928, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901939, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901949, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901959, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901986, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901996, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 902009, tzinfo=datetime.timezone.utc))} (T+46743070 ms) 2026-03-25 10:27:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 26, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774434387.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46680.001, raw_value=46680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 27, 878477, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 28, 899348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902253, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902280, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902294, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902305, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902315, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902341, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902355, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 26, 30, 902368, tzinfo=datetime.timezone.utc))} (T+46743070 ms) 2026-03-25 10:28:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46803068 ms) 2026-03-25 10:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46803068 ms) 2026-03-25 10:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 28, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774434507.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46800.001, raw_value=46800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 28, 900797, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903834, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903873, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903937, tzinfo=datetime.timezone.utc))} (T+46803069 ms) 2026-03-25 10:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 27, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774434447.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46740.001, raw_value=46740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 28, 900547, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901902, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901928, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901939, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901949, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901959, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901986, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901996, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 902009, tzinfo=datetime.timezone.utc))} (T+46803070 ms) 2026-03-25 10:28:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46803071 ms) 2026-03-25 10:28:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46803071 ms) 2026-03-25 10:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 28, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774434507.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46800.001, raw_value=46800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 28, 900797, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903834, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903873, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903937, tzinfo=datetime.timezone.utc))} (T+46803072 ms) 2026-03-25 10:28:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 27, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774434447.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878260, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46740.001, raw_value=46740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 28, 900547, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901902, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901928, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901939, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901949, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901959, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901986, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 901996, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 27, 30, 902009, tzinfo=datetime.timezone.utc))} (T+46803073 ms) 2026-03-25 10:29:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46863067 ms) 2026-03-25 10:29:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46863068 ms) 2026-03-25 10:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 29, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774434567.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46860.001, raw_value=46860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903512, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903540, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903552, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903612, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903626, tzinfo=datetime.timezone.utc))} (T+46863069 ms) 2026-03-25 10:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 28, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774434507.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46800.001, raw_value=46800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 28, 900797, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903834, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903873, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903937, tzinfo=datetime.timezone.utc))} (T+46863069 ms) 2026-03-25 10:29:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46863070 ms) 2026-03-25 10:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46863070 ms) 2026-03-25 10:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 29, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774434567.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46860.001, raw_value=46860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903512, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903540, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903552, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903612, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903626, tzinfo=datetime.timezone.utc))} (T+46863071 ms) 2026-03-25 10:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 28, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774434507.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46800.001, raw_value=46800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 27, 878525, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 28, 900797, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903834, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903873, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903914, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903924, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 28, 30, 903937, tzinfo=datetime.timezone.utc))} (T+46863072 ms) 2026-03-25 10:30:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46923068 ms) 2026-03-25 10:30:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46923069 ms) 2026-03-25 10:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 30, 27, 878428, tzinfo=datetime.timezone.utc), raw_value=1774434627.878428, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878541, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46920.001, raw_value=46920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878768, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 28, 901484, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904435, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904479, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904489, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904500, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904509, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904520, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904530, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904543, tzinfo=datetime.timezone.utc))} (T+46923071 ms) 2026-03-25 10:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 29, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774434567.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46860.001, raw_value=46860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903512, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903540, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903552, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903612, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903626, tzinfo=datetime.timezone.utc))} (T+46923072 ms) 2026-03-25 10:30:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46923072 ms) 2026-03-25 10:30:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46923073 ms) 2026-03-25 10:30:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 30, 27, 878428, tzinfo=datetime.timezone.utc), raw_value=1774434627.878428, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878541, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46920.001, raw_value=46920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878768, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 28, 901484, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904435, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904479, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904489, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904500, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904509, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904520, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904530, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904543, tzinfo=datetime.timezone.utc))} (T+46923077 ms) 2026-03-25 10:30:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 29, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774434567.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46860.001, raw_value=46860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 28, 900535, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903512, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903540, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903552, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903612, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 29, 30, 903626, tzinfo=datetime.timezone.utc))} (T+46923078 ms) 2026-03-25 10:31:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+46983068 ms) 2026-03-25 10:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+46983069 ms) 2026-03-25 10:31:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 31, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434687.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46980.001, raw_value=46980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 28, 901366, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904337, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904349, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904359, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904369, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904390, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904415, tzinfo=datetime.timezone.utc))} (T+46983069 ms) 2026-03-25 10:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 30, 27, 878428, tzinfo=datetime.timezone.utc), raw_value=1774434627.878428, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878541, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46920.001, raw_value=46920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878768, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 28, 901484, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904435, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904479, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904489, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904500, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904509, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904520, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904530, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904543, tzinfo=datetime.timezone.utc))} (T+46983070 ms) 2026-03-25 10:31:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+46983071 ms) 2026-03-25 10:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+46983071 ms) 2026-03-25 10:31:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 31, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434687.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46980.001, raw_value=46980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 28, 901366, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904337, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904349, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904359, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904369, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904390, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904415, tzinfo=datetime.timezone.utc))} (T+46983072 ms) 2026-03-25 10:31:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 30, 27, 878428, tzinfo=datetime.timezone.utc), raw_value=1774434627.878428, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878541, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46920.001, raw_value=46920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 27, 878768, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 28, 901484, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904435, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904479, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904489, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904500, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904509, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904520, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904530, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 30, 30, 904543, tzinfo=datetime.timezone.utc))} (T+46983073 ms) 2026-03-25 10:32:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47043067 ms) 2026-03-25 10:32:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47043068 ms) 2026-03-25 10:32:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774434747.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47040.001, raw_value=47040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903689, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903715, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903726, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903756, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903794, tzinfo=datetime.timezone.utc))} (T+47043069 ms) 2026-03-25 10:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 31, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434687.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46980.001, raw_value=46980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 28, 901366, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904337, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904349, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904359, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904369, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904390, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904415, tzinfo=datetime.timezone.utc))} (T+47043070 ms) 2026-03-25 10:32:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47043070 ms) 2026-03-25 10:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47043070 ms) 2026-03-25 10:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774434747.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47040.001, raw_value=47040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903689, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903715, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903726, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903756, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903794, tzinfo=datetime.timezone.utc))} (T+47043072 ms) 2026-03-25 10:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 31, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434687.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=46980.001, raw_value=46980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 28, 901366, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904310, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904337, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904349, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904359, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904369, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904390, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904400, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 31, 30, 904415, tzinfo=datetime.timezone.utc))} (T+47043072 ms) 2026-03-25 10:33:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47103068 ms) 2026-03-25 10:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47103068 ms) 2026-03-25 10:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 33, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434807.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47100.001, raw_value=47100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903662, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903776, tzinfo=datetime.timezone.utc))} (T+47103069 ms) 2026-03-25 10:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774434747.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47040.001, raw_value=47040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903689, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903715, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903726, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903756, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903794, tzinfo=datetime.timezone.utc))} (T+47103070 ms) 2026-03-25 10:33:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47103071 ms) 2026-03-25 10:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47103071 ms) 2026-03-25 10:33:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 33, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434807.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47100.001, raw_value=47100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903662, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903776, tzinfo=datetime.timezone.utc))} (T+47103073 ms) 2026-03-25 10:33:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 32, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774434747.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47040.001, raw_value=47040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903689, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903715, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903726, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903756, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903778, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 32, 30, 903794, tzinfo=datetime.timezone.utc))} (T+47103073 ms) 2026-03-25 10:34:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47163068 ms) 2026-03-25 10:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47163068 ms) 2026-03-25 10:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 34, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774434867.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47160.001, raw_value=47160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 28, 900741, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903742, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903769, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903849, tzinfo=datetime.timezone.utc))} (T+47163069 ms) 2026-03-25 10:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 33, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434807.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47100.001, raw_value=47100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903662, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903776, tzinfo=datetime.timezone.utc))} (T+47163070 ms) 2026-03-25 10:34:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47163071 ms) 2026-03-25 10:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47163071 ms) 2026-03-25 10:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 34, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774434867.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47160.001, raw_value=47160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 28, 900741, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903742, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903769, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903849, tzinfo=datetime.timezone.utc))} (T+47163072 ms) 2026-03-25 10:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 33, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434807.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47100.001, raw_value=47100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903662, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 33, 30, 903776, tzinfo=datetime.timezone.utc))} (T+47163073 ms) 2026-03-25 10:35:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47223068 ms) 2026-03-25 10:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47223069 ms) 2026-03-25 10:35:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 35, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434927.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878357, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47220.001, raw_value=47220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878606, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 28, 901404, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904358, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904441, tzinfo=datetime.timezone.utc))} (T+47223070 ms) 2026-03-25 10:35:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 34, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774434867.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47160.001, raw_value=47160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 28, 900741, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903742, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903769, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903849, tzinfo=datetime.timezone.utc))} (T+47223071 ms) 2026-03-25 10:35:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47223071 ms) 2026-03-25 10:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47223072 ms) 2026-03-25 10:35:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 35, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434927.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878357, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47220.001, raw_value=47220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878606, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 28, 901404, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904358, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904441, tzinfo=datetime.timezone.utc))} (T+47223073 ms) 2026-03-25 10:35:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 34, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774434867.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47160.001, raw_value=47160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 28, 900741, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903742, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903769, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 34, 30, 903849, tzinfo=datetime.timezone.utc))} (T+47223074 ms) 2026-03-25 10:36:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47283068 ms) 2026-03-25 10:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47283068 ms) 2026-03-25 10:36:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434987.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47280.001, raw_value=47280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 28, 900649, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903714, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903742, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903755, tzinfo=datetime.timezone.utc))} (T+47283069 ms) 2026-03-25 10:36:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 35, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434927.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878357, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47220.001, raw_value=47220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878606, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 28, 901404, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904358, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904441, tzinfo=datetime.timezone.utc))} (T+47283070 ms) 2026-03-25 10:36:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47283071 ms) 2026-03-25 10:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47283071 ms) 2026-03-25 10:36:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434987.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47280.001, raw_value=47280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 28, 900649, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903714, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903742, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903755, tzinfo=datetime.timezone.utc))} (T+47283072 ms) 2026-03-25 10:36:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 35, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774434927.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878357, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47220.001, raw_value=47220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 27, 878606, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 28, 901404, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904358, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 35, 30, 904441, tzinfo=datetime.timezone.utc))} (T+47283073 ms) 2026-03-25 10:37:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47343068 ms) 2026-03-25 10:37:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47343069 ms) 2026-03-25 10:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 37, 27, 878242, tzinfo=datetime.timezone.utc), raw_value=1774435047.878242, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47340.001, raw_value=47340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878628, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 28, 901847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904828, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904839, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904850, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904890, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904902, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904915, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904925, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904939, tzinfo=datetime.timezone.utc))} (T+47343070 ms) 2026-03-25 10:37:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434987.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47280.001, raw_value=47280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 28, 900649, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903714, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903742, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903755, tzinfo=datetime.timezone.utc))} (T+47343071 ms) 2026-03-25 10:37:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47343071 ms) 2026-03-25 10:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47343072 ms) 2026-03-25 10:37:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 37, 27, 878242, tzinfo=datetime.timezone.utc), raw_value=1774435047.878242, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47340.001, raw_value=47340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878628, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 28, 901847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904828, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904839, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904850, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904890, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904902, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904915, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904925, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904939, tzinfo=datetime.timezone.utc))} (T+47343073 ms) 2026-03-25 10:37:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774434987.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47280.001, raw_value=47280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 28, 900649, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903714, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903742, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 36, 30, 903755, tzinfo=datetime.timezone.utc))} (T+47343073 ms) 2026-03-25 10:38:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47403067 ms) 2026-03-25 10:38:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47403068 ms) 2026-03-25 10:38:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 38, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774435107.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47400.001, raw_value=47400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 28, 900545, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903600, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903615, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903682, tzinfo=datetime.timezone.utc))} (T+47403069 ms) 2026-03-25 10:38:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 37, 27, 878242, tzinfo=datetime.timezone.utc), raw_value=1774435047.878242, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47340.001, raw_value=47340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878628, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 28, 901847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904828, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904839, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904850, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904890, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904902, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904915, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904925, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904939, tzinfo=datetime.timezone.utc))} (T+47403070 ms) 2026-03-25 10:38:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47403070 ms) 2026-03-25 10:38:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47403071 ms) 2026-03-25 10:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 38, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774435107.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47400.001, raw_value=47400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 28, 900545, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903600, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903615, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903682, tzinfo=datetime.timezone.utc))} (T+47403072 ms) 2026-03-25 10:38:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 37, 27, 878242, tzinfo=datetime.timezone.utc), raw_value=1774435047.878242, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878379, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47340.001, raw_value=47340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 27, 878628, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 28, 901847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904828, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904839, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904850, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904890, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904902, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904915, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904925, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 37, 30, 904939, tzinfo=datetime.timezone.utc))} (T+47403073 ms) 2026-03-25 10:39:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47463067 ms) 2026-03-25 10:39:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47463068 ms) 2026-03-25 10:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 39, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774435167.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47460.001, raw_value=47460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 28, 900466, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903450, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903477, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903499, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903535, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903561, tzinfo=datetime.timezone.utc))} (T+47463069 ms) 2026-03-25 10:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 38, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774435107.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47400.001, raw_value=47400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 28, 900545, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903600, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903615, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903682, tzinfo=datetime.timezone.utc))} (T+47463070 ms) 2026-03-25 10:39:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47463071 ms) 2026-03-25 10:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47463071 ms) 2026-03-25 10:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 39, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774435167.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47460.001, raw_value=47460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 28, 900466, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903450, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903477, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903499, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903535, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903561, tzinfo=datetime.timezone.utc))} (T+47463072 ms) 2026-03-25 10:39:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 38, 27, 878160, tzinfo=datetime.timezone.utc), raw_value=1774435107.87816, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47400.001, raw_value=47400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 28, 900545, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903600, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903615, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903627, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903638, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 38, 30, 903682, tzinfo=datetime.timezone.utc))} (T+47463073 ms) 2026-03-25 10:40:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47523067 ms) 2026-03-25 10:40:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47523068 ms) 2026-03-25 10:40:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 40, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435227.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47520.001, raw_value=47520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 28, 900442, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903534, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903556, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903569, tzinfo=datetime.timezone.utc))} (T+47523070 ms) 2026-03-25 10:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 39, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774435167.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47460.001, raw_value=47460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 28, 900466, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903450, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903477, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903499, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903535, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903561, tzinfo=datetime.timezone.utc))} (T+47523071 ms) 2026-03-25 10:40:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47523071 ms) 2026-03-25 10:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47523072 ms) 2026-03-25 10:40:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 40, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435227.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47520.001, raw_value=47520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 28, 900442, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903534, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903556, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903569, tzinfo=datetime.timezone.utc))} (T+47523076 ms) 2026-03-25 10:40:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 39, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774435167.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47460.001, raw_value=47460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 28, 900466, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903450, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903477, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903499, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903535, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903548, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 39, 30, 903561, tzinfo=datetime.timezone.utc))} (T+47523077 ms) 2026-03-25 10:41:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47583068 ms) 2026-03-25 10:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47583068 ms) 2026-03-25 10:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 41, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774435287.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47580.001, raw_value=47580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 28, 900830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903887, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903915, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903957, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903968, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903991, tzinfo=datetime.timezone.utc))} (T+47583070 ms) 2026-03-25 10:41:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 40, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435227.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47520.001, raw_value=47520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 28, 900442, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903534, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903556, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903569, tzinfo=datetime.timezone.utc))} (T+47583071 ms) 2026-03-25 10:41:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47583072 ms) 2026-03-25 10:41:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47583072 ms) 2026-03-25 10:41:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 41, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774435287.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47580.001, raw_value=47580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 28, 900830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903887, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903915, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903957, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903968, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903991, tzinfo=datetime.timezone.utc))} (T+47583077 ms) 2026-03-25 10:41:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 40, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435227.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47520.001, raw_value=47520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 28, 900442, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903534, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903546, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903556, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 40, 30, 903569, tzinfo=datetime.timezone.utc))} (T+47583078 ms) 2026-03-25 10:42:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47643068 ms) 2026-03-25 10:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47643069 ms) 2026-03-25 10:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 42, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435347.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47640.001, raw_value=47640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 28, 901112, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904092, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904120, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904134, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904146, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904156, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904166, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904176, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904189, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904203, tzinfo=datetime.timezone.utc))} (T+47643070 ms) 2026-03-25 10:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 41, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774435287.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47580.001, raw_value=47580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 28, 900830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903887, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903915, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903957, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903968, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903991, tzinfo=datetime.timezone.utc))} (T+47643071 ms) 2026-03-25 10:42:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47643072 ms) 2026-03-25 10:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47643072 ms) 2026-03-25 10:42:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 42, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435347.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47640.001, raw_value=47640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 28, 901112, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904092, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904120, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904134, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904146, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904156, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904166, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904176, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904189, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904203, tzinfo=datetime.timezone.utc))} (T+47643073 ms) 2026-03-25 10:42:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 41, 27, 878140, tzinfo=datetime.timezone.utc), raw_value=1774435287.87814, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47580.001, raw_value=47580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 28, 900830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903887, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903915, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903937, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903947, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903957, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903968, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 41, 30, 903991, tzinfo=datetime.timezone.utc))} (T+47643074 ms) 2026-03-25 10:43:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47703068 ms) 2026-03-25 10:43:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47703069 ms) 2026-03-25 10:43:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 43, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774435407.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47700.001, raw_value=47700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 28, 901486, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904427, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904456, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904467, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904488, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904498, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904532, tzinfo=datetime.timezone.utc))} (T+47703072 ms) 2026-03-25 10:43:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 42, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435347.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47640.001, raw_value=47640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 28, 901112, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904092, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904120, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904134, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904146, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904156, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904166, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904176, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904189, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904203, tzinfo=datetime.timezone.utc))} (T+47703072 ms) 2026-03-25 10:43:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47703073 ms) 2026-03-25 10:43:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47703073 ms) 2026-03-25 10:43:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 43, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774435407.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47700.001, raw_value=47700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 28, 901486, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904427, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904456, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904467, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904488, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904498, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904532, tzinfo=datetime.timezone.utc))} (T+47703074 ms) 2026-03-25 10:43:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 42, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435347.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47640.001, raw_value=47640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 28, 901112, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904092, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904120, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904134, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904146, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904156, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904166, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904176, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904189, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 42, 30, 904203, tzinfo=datetime.timezone.utc))} (T+47703075 ms) 2026-03-25 10:44:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47763069 ms) 2026-03-25 10:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47763070 ms) 2026-03-25 10:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 44, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774435467.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47760.001, raw_value=47760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 28, 903325, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905394, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905415, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905440, tzinfo=datetime.timezone.utc))} (T+47763071 ms) 2026-03-25 10:44:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 43, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774435407.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47700.001, raw_value=47700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 28, 901486, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904427, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904456, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904467, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904488, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904498, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904532, tzinfo=datetime.timezone.utc))} (T+47763071 ms) 2026-03-25 10:44:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47763072 ms) 2026-03-25 10:44:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47763072 ms) 2026-03-25 10:44:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 44, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774435467.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47760.001, raw_value=47760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 28, 903325, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905394, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905415, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905440, tzinfo=datetime.timezone.utc))} (T+47763073 ms) 2026-03-25 10:44:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 43, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774435407.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47700.001, raw_value=47700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 28, 901486, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904427, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904456, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904467, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904477, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904488, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904498, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904518, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 43, 30, 904532, tzinfo=datetime.timezone.utc))} (T+47763074 ms) 2026-03-25 10:45:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47823067 ms) 2026-03-25 10:45:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47823068 ms) 2026-03-25 10:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774435527.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47820.001, raw_value=47820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 28, 900553, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903595, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903625, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903659, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903680, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903706, tzinfo=datetime.timezone.utc))} (T+47823071 ms) 2026-03-25 10:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 44, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774435467.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47760.001, raw_value=47760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 28, 903325, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905394, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905415, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905440, tzinfo=datetime.timezone.utc))} (T+47823072 ms) 2026-03-25 10:45:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47823073 ms) 2026-03-25 10:45:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47823073 ms) 2026-03-25 10:45:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774435527.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47820.001, raw_value=47820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 28, 900553, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903595, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903625, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903659, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903680, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903706, tzinfo=datetime.timezone.utc))} (T+47823078 ms) 2026-03-25 10:45:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 44, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774435467.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47760.001, raw_value=47760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 28, 903325, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905394, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905415, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 44, 30, 905440, tzinfo=datetime.timezone.utc))} (T+47823078 ms) 2026-03-25 10:46:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47883068 ms) 2026-03-25 10:46:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47883068 ms) 2026-03-25 10:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 46, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435587.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47880.001, raw_value=47880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 28, 900930, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903951, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903988, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904023, tzinfo=datetime.timezone.utc))} (T+47883071 ms) 2026-03-25 10:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774435527.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47820.001, raw_value=47820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 28, 900553, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903595, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903625, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903659, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903680, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903706, tzinfo=datetime.timezone.utc))} (T+47883072 ms) 2026-03-25 10:46:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47883073 ms) 2026-03-25 10:46:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47883073 ms) 2026-03-25 10:46:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 46, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435587.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47880.001, raw_value=47880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 28, 900930, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903951, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903988, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904023, tzinfo=datetime.timezone.utc))} (T+47883077 ms) 2026-03-25 10:46:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 45, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774435527.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47820.001, raw_value=47820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 28, 900553, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903595, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903625, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903648, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903659, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903669, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903680, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903690, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 45, 30, 903706, tzinfo=datetime.timezone.utc))} (T+47883078 ms) 2026-03-25 10:47:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+47943068 ms) 2026-03-25 10:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+47943068 ms) 2026-03-25 10:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 47, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435647.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47940.001, raw_value=47940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 28, 901065, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904059, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904070, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904080, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904091, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904111, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904134, tzinfo=datetime.timezone.utc))} (T+47943069 ms) 2026-03-25 10:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 46, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435587.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47880.001, raw_value=47880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 28, 900930, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903951, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903988, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904023, tzinfo=datetime.timezone.utc))} (T+47943071 ms) 2026-03-25 10:47:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+47943072 ms) 2026-03-25 10:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+47943072 ms) 2026-03-25 10:47:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 47, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435647.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47940.001, raw_value=47940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 28, 901065, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904059, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904070, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904080, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904091, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904111, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904134, tzinfo=datetime.timezone.utc))} (T+47943075 ms) 2026-03-25 10:47:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 46, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435587.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47880.001, raw_value=47880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 28, 900930, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903951, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 903988, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 46, 30, 904023, tzinfo=datetime.timezone.utc))} (T+47943076 ms) 2026-03-25 10:48:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48003068 ms) 2026-03-25 10:48:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48003068 ms) 2026-03-25 10:48:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 48, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774435707.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48000.001, raw_value=48000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 28, 900773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903840, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903920, tzinfo=datetime.timezone.utc))} (T+48003069 ms) 2026-03-25 10:48:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 47, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435647.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47940.001, raw_value=47940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 28, 901065, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904059, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904070, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904080, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904091, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904111, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904134, tzinfo=datetime.timezone.utc))} (T+48003070 ms) 2026-03-25 10:48:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48003071 ms) 2026-03-25 10:48:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48003071 ms) 2026-03-25 10:48:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 48, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774435707.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48000.001, raw_value=48000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 28, 900773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903840, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903920, tzinfo=datetime.timezone.utc))} (T+48003072 ms) 2026-03-25 10:48:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 47, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774435647.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=47940.001, raw_value=47940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 28, 901065, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904059, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904070, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904080, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904091, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904111, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 47, 30, 904134, tzinfo=datetime.timezone.utc))} (T+48003072 ms) 2026-03-25 10:49:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48063072 ms) 2026-03-25 10:49:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48063073 ms) 2026-03-25 10:49:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 49, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774435767.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878358, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48060.001, raw_value=48060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 28, 905540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908497, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908566, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908577, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908587, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908600, tzinfo=datetime.timezone.utc))} (T+48063074 ms) 2026-03-25 10:49:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 48, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774435707.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48000.001, raw_value=48000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 28, 900773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903840, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903920, tzinfo=datetime.timezone.utc))} (T+48063074 ms) 2026-03-25 10:49:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48063075 ms) 2026-03-25 10:49:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48063075 ms) 2026-03-25 10:49:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 49, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774435767.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878358, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48060.001, raw_value=48060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 28, 905540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908497, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908566, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908577, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908587, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908600, tzinfo=datetime.timezone.utc))} (T+48063076 ms) 2026-03-25 10:49:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 48, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774435707.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48000.001, raw_value=48000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 28, 900773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903840, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 48, 30, 903920, tzinfo=datetime.timezone.utc))} (T+48063076 ms) 2026-03-25 10:50:30.903 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48123065 ms) 2026-03-25 10:50:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48123065 ms) 2026-03-25 10:50:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 50, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774435827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48120.001, raw_value=48120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 28, 900185, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901361, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901375, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901386, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901396, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901441, tzinfo=datetime.timezone.utc))} (T+48123067 ms) 2026-03-25 10:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 49, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774435767.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878358, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48060.001, raw_value=48060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 28, 905540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908497, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908566, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908577, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908587, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908600, tzinfo=datetime.timezone.utc))} (T+48123068 ms) 2026-03-25 10:50:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48123069 ms) 2026-03-25 10:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48123069 ms) 2026-03-25 10:50:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 50, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774435827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48120.001, raw_value=48120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 28, 900185, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901361, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901375, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901386, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901396, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901441, tzinfo=datetime.timezone.utc))} (T+48123077 ms) 2026-03-25 10:50:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 49, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774435767.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878358, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48060.001, raw_value=48060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 28, 905540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908497, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908523, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908535, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908545, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908556, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908566, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908577, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908587, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 49, 30, 908600, tzinfo=datetime.timezone.utc))} (T+48123078 ms) 2026-03-25 10:51:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48183070 ms) 2026-03-25 10:51:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48183070 ms) 2026-03-25 10:51:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 51, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435887.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48180.001, raw_value=48180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 28, 902786, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905863, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905876, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905913, tzinfo=datetime.timezone.utc))} (T+48183074 ms) 2026-03-25 10:51:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 50, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774435827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48120.001, raw_value=48120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 28, 900185, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901361, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901375, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901386, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901396, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901441, tzinfo=datetime.timezone.utc))} (T+48183074 ms) 2026-03-25 10:51:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48183075 ms) 2026-03-25 10:51:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48183075 ms) 2026-03-25 10:51:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 51, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435887.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48180.001, raw_value=48180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 28, 902786, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905863, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905876, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905913, tzinfo=datetime.timezone.utc))} (T+48183084 ms) 2026-03-25 10:51:30.923 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 50, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774435827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48120.001, raw_value=48120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 28, 900185, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901361, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901375, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901386, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901396, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 50, 30, 901441, tzinfo=datetime.timezone.utc))} (T+48183084 ms) 2026-03-25 10:52:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48243068 ms) 2026-03-25 10:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48243068 ms) 2026-03-25 10:52:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 52, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774435947.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48240.001, raw_value=48240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 28, 900847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903845, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903872, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903884, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903894, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903905, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903926, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903952, tzinfo=datetime.timezone.utc))} (T+48243071 ms) 2026-03-25 10:52:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 51, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435887.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48180.001, raw_value=48180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 28, 902786, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905863, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905876, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905913, tzinfo=datetime.timezone.utc))} (T+48243072 ms) 2026-03-25 10:52:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48243073 ms) 2026-03-25 10:52:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48243073 ms) 2026-03-25 10:52:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 52, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774435947.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48240.001, raw_value=48240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 28, 900847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903845, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903872, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903884, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903894, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903905, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903926, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903952, tzinfo=datetime.timezone.utc))} (T+48243080 ms) 2026-03-25 10:52:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 51, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774435887.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48180.001, raw_value=48180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 28, 902786, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905863, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905876, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905887, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905897, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 51, 30, 905913, tzinfo=datetime.timezone.utc))} (T+48243081 ms) 2026-03-25 10:53:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48303067 ms) 2026-03-25 10:53:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48303068 ms) 2026-03-25 10:53:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 53, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774436007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48300.001, raw_value=48300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903655, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903683, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903746, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+48303069 ms) 2026-03-25 10:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 52, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774435947.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48240.001, raw_value=48240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 28, 900847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903845, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903872, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903884, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903894, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903905, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903926, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903952, tzinfo=datetime.timezone.utc))} (T+48303070 ms) 2026-03-25 10:53:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48303070 ms) 2026-03-25 10:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48303070 ms) 2026-03-25 10:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 53, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774436007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48300.001, raw_value=48300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903655, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903683, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903746, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+48303071 ms) 2026-03-25 10:53:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 52, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774435947.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48240.001, raw_value=48240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 28, 900847, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903845, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903872, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903884, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903894, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903905, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903926, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 52, 30, 903952, tzinfo=datetime.timezone.utc))} (T+48303072 ms) 2026-03-25 10:54:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48363069 ms) 2026-03-25 10:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48363070 ms) 2026-03-25 10:54:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 54, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774436067.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48360.001, raw_value=48360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903758, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903794, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903810, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903833, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903856, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903867, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903881, tzinfo=datetime.timezone.utc))} (T+48363071 ms) 2026-03-25 10:54:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 53, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774436007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48300.001, raw_value=48300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903655, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903683, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903746, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+48363073 ms) 2026-03-25 10:54:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48363074 ms) 2026-03-25 10:54:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48363074 ms) 2026-03-25 10:54:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 54, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774436067.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48360.001, raw_value=48360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903758, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903794, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903810, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903833, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903856, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903867, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903881, tzinfo=datetime.timezone.utc))} (T+48363075 ms) 2026-03-25 10:54:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 53, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774436007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48300.001, raw_value=48300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 28, 900681, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903655, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903683, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903746, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+48363076 ms) 2026-03-25 10:55:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48423068 ms) 2026-03-25 10:55:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48423068 ms) 2026-03-25 10:55:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 55, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774436127.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48420.001, raw_value=48420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903791, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903812, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903855, tzinfo=datetime.timezone.utc))} (T+48423069 ms) 2026-03-25 10:55:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 54, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774436067.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48360.001, raw_value=48360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903758, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903794, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903810, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903833, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903856, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903867, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903881, tzinfo=datetime.timezone.utc))} (T+48423070 ms) 2026-03-25 10:55:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48423071 ms) 2026-03-25 10:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48423071 ms) 2026-03-25 10:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 55, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774436127.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48420.001, raw_value=48420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903791, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903812, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903855, tzinfo=datetime.timezone.utc))} (T+48423072 ms) 2026-03-25 10:55:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 54, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774436067.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48360.001, raw_value=48360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 28, 900596, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903758, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903794, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903810, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903833, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903856, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903867, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 54, 30, 903881, tzinfo=datetime.timezone.utc))} (T+48423072 ms) 2026-03-25 10:56:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48483068 ms) 2026-03-25 10:56:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48483069 ms) 2026-03-25 10:56:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 56, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774436187.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48480.001, raw_value=48480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 28, 901590, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904593, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904605, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904647, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904657, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904676, tzinfo=datetime.timezone.utc))} (T+48483069 ms) 2026-03-25 10:56:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 55, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774436127.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48420.001, raw_value=48420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903791, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903812, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903855, tzinfo=datetime.timezone.utc))} (T+48483070 ms) 2026-03-25 10:56:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48483071 ms) 2026-03-25 10:56:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48483071 ms) 2026-03-25 10:56:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 56, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774436187.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48480.001, raw_value=48480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 28, 901590, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904593, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904605, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904647, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904657, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904676, tzinfo=datetime.timezone.utc))} (T+48483071 ms) 2026-03-25 10:56:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 55, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774436127.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48420.001, raw_value=48420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903791, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903812, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903832, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 55, 30, 903855, tzinfo=datetime.timezone.utc))} (T+48483072 ms) 2026-03-25 10:57:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48543067 ms) 2026-03-25 10:57:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48543068 ms) 2026-03-25 10:57:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 57, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436247.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48540.001, raw_value=48540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 28, 900603, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903551, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903577, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903588, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903618, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903640, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903653, tzinfo=datetime.timezone.utc))} (T+48543069 ms) 2026-03-25 10:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 56, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774436187.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48480.001, raw_value=48480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 28, 901590, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904593, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904605, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904647, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904657, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904676, tzinfo=datetime.timezone.utc))} (T+48543069 ms) 2026-03-25 10:57:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48543070 ms) 2026-03-25 10:57:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48543070 ms) 2026-03-25 10:57:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 57, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436247.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48540.001, raw_value=48540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 28, 900603, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903551, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903577, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903588, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903618, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903640, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903653, tzinfo=datetime.timezone.utc))} (T+48543071 ms) 2026-03-25 10:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 56, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774436187.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48480.001, raw_value=48480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 28, 901590, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904593, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904605, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904647, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904657, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 56, 30, 904676, tzinfo=datetime.timezone.utc))} (T+48543071 ms) 2026-03-25 10:58:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48603068 ms) 2026-03-25 10:58:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48603069 ms) 2026-03-25 10:58:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 58, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774436307.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48600.001, raw_value=48600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 28, 901301, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904263, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904371, tzinfo=datetime.timezone.utc))} (T+48603071 ms) 2026-03-25 10:58:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 57, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436247.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48540.001, raw_value=48540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 28, 900603, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903551, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903577, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903588, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903618, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903640, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903653, tzinfo=datetime.timezone.utc))} (T+48603071 ms) 2026-03-25 10:58:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48603072 ms) 2026-03-25 10:58:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48603072 ms) 2026-03-25 10:58:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 58, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774436307.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48600.001, raw_value=48600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 28, 901301, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904263, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904371, tzinfo=datetime.timezone.utc))} (T+48603077 ms) 2026-03-25 10:58:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 57, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436247.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48540.001, raw_value=48540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 28, 900603, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903551, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903577, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903588, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903618, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903629, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903640, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 57, 30, 903653, tzinfo=datetime.timezone.utc))} (T+48603077 ms) 2026-03-25 10:59:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48663069 ms) 2026-03-25 10:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48663069 ms) 2026-03-25 10:59:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 59, 27, 878232, tzinfo=datetime.timezone.utc), raw_value=1774436367.878232, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878371, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48660.001, raw_value=48660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878616, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 28, 901361, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904601, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904667, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904678, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904688, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904716, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904734, tzinfo=datetime.timezone.utc))} (T+48663070 ms) 2026-03-25 10:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 58, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774436307.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48600.001, raw_value=48600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 28, 901301, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904263, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904371, tzinfo=datetime.timezone.utc))} (T+48663071 ms) 2026-03-25 10:59:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48663072 ms) 2026-03-25 10:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48663072 ms) 2026-03-25 10:59:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 59, 27, 878232, tzinfo=datetime.timezone.utc), raw_value=1774436367.878232, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878371, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48660.001, raw_value=48660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878616, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 28, 901361, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904601, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904667, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904678, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904688, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904716, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904734, tzinfo=datetime.timezone.utc))} (T+48663073 ms) 2026-03-25 10:59:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 58, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774436307.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48600.001, raw_value=48600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 28, 901301, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904263, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904318, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904328, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 58, 30, 904371, tzinfo=datetime.timezone.utc))} (T+48663073 ms) 2026-03-25 11:00:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48723068 ms) 2026-03-25 11:00:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48723068 ms) 2026-03-25 11:00:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 0, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774436427.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48720.001, raw_value=48720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 28, 900951, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903921, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903948, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903959, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903970, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903980, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903990, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904030, tzinfo=datetime.timezone.utc))} (T+48723069 ms) 2026-03-25 11:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 59, 27, 878232, tzinfo=datetime.timezone.utc), raw_value=1774436367.878232, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878371, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48660.001, raw_value=48660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878616, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 28, 901361, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904601, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904667, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904678, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904688, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904716, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904734, tzinfo=datetime.timezone.utc))} (T+48723070 ms) 2026-03-25 11:00:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48723071 ms) 2026-03-25 11:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48723071 ms) 2026-03-25 11:00:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 0, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774436427.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48720.001, raw_value=48720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 28, 900951, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903921, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903948, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903959, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903970, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903980, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903990, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904030, tzinfo=datetime.timezone.utc))} (T+48723071 ms) 2026-03-25 11:00:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 10, 59, 27, 878232, tzinfo=datetime.timezone.utc), raw_value=1774436367.878232, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878371, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48660.001, raw_value=48660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 27, 878616, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 28, 901361, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904601, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904667, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904678, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904688, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904705, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904716, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 10, 59, 30, 904734, tzinfo=datetime.timezone.utc))} (T+48723072 ms) 2026-03-25 11:01:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48783068 ms) 2026-03-25 11:01:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48783068 ms) 2026-03-25 11:01:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 1, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774436487.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48780.001, raw_value=48780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 28, 900711, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903692, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903793, tzinfo=datetime.timezone.utc))} (T+48783069 ms) 2026-03-25 11:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 0, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774436427.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48720.001, raw_value=48720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 28, 900951, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903921, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903948, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903959, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903970, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903980, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903990, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904030, tzinfo=datetime.timezone.utc))} (T+48783070 ms) 2026-03-25 11:01:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48783071 ms) 2026-03-25 11:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48783071 ms) 2026-03-25 11:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 1, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774436487.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48780.001, raw_value=48780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 28, 900711, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903692, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903793, tzinfo=datetime.timezone.utc))} (T+48783071 ms) 2026-03-25 11:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 0, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774436427.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48720.001, raw_value=48720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 27, 878553, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 28, 900951, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903921, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903948, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903959, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903970, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903980, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 903990, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904014, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 0, 30, 904030, tzinfo=datetime.timezone.utc))} (T+48783072 ms) 2026-03-25 11:02:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48843068 ms) 2026-03-25 11:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48843069 ms) 2026-03-25 11:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 2, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774436547.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48840.001, raw_value=48840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 28, 901728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904680, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904691, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904702, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904712, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904733, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904749, tzinfo=datetime.timezone.utc))} (T+48843070 ms) 2026-03-25 11:02:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 1, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774436487.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48780.001, raw_value=48780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 28, 900711, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903692, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903793, tzinfo=datetime.timezone.utc))} (T+48843070 ms) 2026-03-25 11:02:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48843071 ms) 2026-03-25 11:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48843071 ms) 2026-03-25 11:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 2, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774436547.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48840.001, raw_value=48840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 28, 901728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904680, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904691, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904702, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904712, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904733, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904749, tzinfo=datetime.timezone.utc))} (T+48843072 ms) 2026-03-25 11:02:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 1, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774436487.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48780.001, raw_value=48780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 28, 900711, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903692, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903740, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903749, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 1, 30, 903793, tzinfo=datetime.timezone.utc))} (T+48843073 ms) 2026-03-25 11:03:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48903068 ms) 2026-03-25 11:03:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48903068 ms) 2026-03-25 11:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 3, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774436607.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48900.001, raw_value=48900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 28, 900692, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903742, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903794, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903820, tzinfo=datetime.timezone.utc))} (T+48903069 ms) 2026-03-25 11:03:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 2, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774436547.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48840.001, raw_value=48840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 28, 901728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904680, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904691, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904702, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904712, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904733, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904749, tzinfo=datetime.timezone.utc))} (T+48903070 ms) 2026-03-25 11:03:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48903071 ms) 2026-03-25 11:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48903071 ms) 2026-03-25 11:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 3, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774436607.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48900.001, raw_value=48900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 28, 900692, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903742, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903794, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903820, tzinfo=datetime.timezone.utc))} (T+48903071 ms) 2026-03-25 11:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 2, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774436547.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48840.001, raw_value=48840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 28, 901728, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904665, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904680, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904691, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904702, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904712, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904733, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 2, 30, 904749, tzinfo=datetime.timezone.utc))} (T+48903072 ms) 2026-03-25 11:04:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+48963067 ms) 2026-03-25 11:04:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+48963068 ms) 2026-03-25 11:04:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 4, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774436667.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48960.001, raw_value=48960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 28, 900509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903549, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903578, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903609, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903634, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903662, tzinfo=datetime.timezone.utc))} (T+48963069 ms) 2026-03-25 11:04:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 3, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774436607.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48900.001, raw_value=48900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 28, 900692, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903742, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903794, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903820, tzinfo=datetime.timezone.utc))} (T+48963070 ms) 2026-03-25 11:04:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+48963070 ms) 2026-03-25 11:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+48963071 ms) 2026-03-25 11:04:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 4, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774436667.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48960.001, raw_value=48960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 28, 900509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903549, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903578, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903609, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903634, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903662, tzinfo=datetime.timezone.utc))} (T+48963071 ms) 2026-03-25 11:04:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 3, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774436607.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48900.001, raw_value=48900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 27, 878461, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 28, 900692, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903713, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903742, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903753, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903764, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903773, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903794, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 3, 30, 903820, tzinfo=datetime.timezone.utc))} (T+48963072 ms) 2026-03-25 11:05:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49023068 ms) 2026-03-25 11:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49023069 ms) 2026-03-25 11:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 5, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774436727.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878347, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49020.001, raw_value=49020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 28, 901289, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904313, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904323, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904366, tzinfo=datetime.timezone.utc))} (T+49023070 ms) 2026-03-25 11:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 4, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774436667.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48960.001, raw_value=48960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 28, 900509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903549, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903578, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903609, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903634, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903662, tzinfo=datetime.timezone.utc))} (T+49023071 ms) 2026-03-25 11:05:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49023071 ms) 2026-03-25 11:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49023072 ms) 2026-03-25 11:05:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 5, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774436727.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878347, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49020.001, raw_value=49020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 28, 901289, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904313, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904323, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904366, tzinfo=datetime.timezone.utc))} (T+49023072 ms) 2026-03-25 11:05:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 4, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774436667.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=48960.001, raw_value=48960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 28, 900509, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903549, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903578, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903589, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903599, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903609, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903623, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903634, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 4, 30, 903662, tzinfo=datetime.timezone.utc))} (T+49023073 ms) 2026-03-25 11:06:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49083067 ms) 2026-03-25 11:06:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49083068 ms) 2026-03-25 11:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 6, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774436787.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49080.001, raw_value=49080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903589, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903616, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903642, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903683, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903699, tzinfo=datetime.timezone.utc))} (T+49083069 ms) 2026-03-25 11:06:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 5, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774436727.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878347, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49020.001, raw_value=49020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 28, 901289, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904313, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904323, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904366, tzinfo=datetime.timezone.utc))} (T+49083070 ms) 2026-03-25 11:06:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49083070 ms) 2026-03-25 11:06:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49083071 ms) 2026-03-25 11:06:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 6, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774436787.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49080.001, raw_value=49080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903589, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903616, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903642, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903683, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903699, tzinfo=datetime.timezone.utc))} (T+49083071 ms) 2026-03-25 11:06:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 5, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774436727.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878347, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49020.001, raw_value=49020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 28, 901289, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904313, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904323, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 5, 30, 904366, tzinfo=datetime.timezone.utc))} (T+49083072 ms) 2026-03-25 11:07:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49143067 ms) 2026-03-25 11:07:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49143068 ms) 2026-03-25 11:07:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 7, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436847.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49140.001, raw_value=49140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 28, 900540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903545, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903582, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903592, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903648, tzinfo=datetime.timezone.utc))} (T+49143069 ms) 2026-03-25 11:07:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 6, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774436787.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49080.001, raw_value=49080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903589, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903616, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903642, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903683, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903699, tzinfo=datetime.timezone.utc))} (T+49143069 ms) 2026-03-25 11:07:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49143070 ms) 2026-03-25 11:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49143070 ms) 2026-03-25 11:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 7, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436847.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49140.001, raw_value=49140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 28, 900540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903545, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903582, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903592, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903648, tzinfo=datetime.timezone.utc))} (T+49143071 ms) 2026-03-25 11:07:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 6, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774436787.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49080.001, raw_value=49080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903589, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903616, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903642, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903683, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 6, 30, 903699, tzinfo=datetime.timezone.utc))} (T+49143071 ms) 2026-03-25 11:08:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49203068 ms) 2026-03-25 11:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49203068 ms) 2026-03-25 11:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 8, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774436907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49200.001, raw_value=49200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 28, 900978, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903973, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903984, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903995, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904005, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904030, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904055, tzinfo=datetime.timezone.utc))} (T+49203069 ms) 2026-03-25 11:08:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 7, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436847.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49140.001, raw_value=49140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 28, 900540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903545, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903582, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903592, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903648, tzinfo=datetime.timezone.utc))} (T+49203069 ms) 2026-03-25 11:08:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49203070 ms) 2026-03-25 11:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49203070 ms) 2026-03-25 11:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 8, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774436907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49200.001, raw_value=49200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 28, 900978, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903973, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903984, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903995, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904005, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904030, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904055, tzinfo=datetime.timezone.utc))} (T+49203071 ms) 2026-03-25 11:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 7, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774436847.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49140.001, raw_value=49140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 28, 900540, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903545, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903582, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903592, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903602, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903612, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903623, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903633, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 7, 30, 903648, tzinfo=datetime.timezone.utc))} (T+49203072 ms) 2026-03-25 11:09:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49263068 ms) 2026-03-25 11:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49263069 ms) 2026-03-25 11:09:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 9, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774436967.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49260.001, raw_value=49260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 28, 901473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904464, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904475, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904486, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904526, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904539, tzinfo=datetime.timezone.utc))} (T+49263070 ms) 2026-03-25 11:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 8, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774436907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49200.001, raw_value=49200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 28, 900978, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903973, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903984, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903995, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904005, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904030, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904055, tzinfo=datetime.timezone.utc))} (T+49263070 ms) 2026-03-25 11:09:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49263071 ms) 2026-03-25 11:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49263071 ms) 2026-03-25 11:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 9, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774436967.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49260.001, raw_value=49260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 28, 901473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904464, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904475, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904486, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904526, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904539, tzinfo=datetime.timezone.utc))} (T+49263072 ms) 2026-03-25 11:09:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 8, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774436907.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49200.001, raw_value=49200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 28, 900978, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903973, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903984, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 903995, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904005, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904030, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 8, 30, 904055, tzinfo=datetime.timezone.utc))} (T+49263073 ms) 2026-03-25 11:10:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49323068 ms) 2026-03-25 11:10:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49323068 ms) 2026-03-25 11:10:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 10, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774437027.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49320.001, raw_value=49320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878562, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 28, 901168, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904139, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904167, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904181, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904192, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904227, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904238, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904253, tzinfo=datetime.timezone.utc))} (T+49323069 ms) 2026-03-25 11:10:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 9, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774436967.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49260.001, raw_value=49260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 28, 901473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904464, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904475, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904486, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904526, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904539, tzinfo=datetime.timezone.utc))} (T+49323070 ms) 2026-03-25 11:10:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49323070 ms) 2026-03-25 11:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49323071 ms) 2026-03-25 11:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 10, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774437027.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49320.001, raw_value=49320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878562, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 28, 901168, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904139, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904167, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904181, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904192, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904227, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904238, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904253, tzinfo=datetime.timezone.utc))} (T+49323071 ms) 2026-03-25 11:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 9, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774436967.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49260.001, raw_value=49260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 28, 901473, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904436, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904464, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904475, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904486, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904506, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904526, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 9, 30, 904539, tzinfo=datetime.timezone.utc))} (T+49323072 ms) 2026-03-25 11:11:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49383067 ms) 2026-03-25 11:11:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49383068 ms) 2026-03-25 11:11:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 11, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774437087.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49380.001, raw_value=49380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903474, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903502, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903513, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903543, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903554, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903564, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903577, tzinfo=datetime.timezone.utc))} (T+49383068 ms) 2026-03-25 11:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 10, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774437027.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49320.001, raw_value=49320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878562, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 28, 901168, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904139, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904167, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904181, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904192, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904227, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904238, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904253, tzinfo=datetime.timezone.utc))} (T+49383069 ms) 2026-03-25 11:11:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49383070 ms) 2026-03-25 11:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49383070 ms) 2026-03-25 11:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 11, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774437087.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49380.001, raw_value=49380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903474, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903502, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903513, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903543, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903554, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903564, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903577, tzinfo=datetime.timezone.utc))} (T+49383071 ms) 2026-03-25 11:11:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 10, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774437027.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49320.001, raw_value=49320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 27, 878562, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 28, 901168, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904139, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904167, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904181, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904192, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904202, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904212, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904227, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904238, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 10, 30, 904253, tzinfo=datetime.timezone.utc))} (T+49383071 ms) 2026-03-25 11:12:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49443067 ms) 2026-03-25 11:12:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49443068 ms) 2026-03-25 11:12:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 12, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774437147.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49440.001, raw_value=49440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 28, 900744, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903711, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903737, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903749, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903770, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903819, tzinfo=datetime.timezone.utc))} (T+49443070 ms) 2026-03-25 11:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 11, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774437087.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49380.001, raw_value=49380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903474, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903502, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903513, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903543, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903554, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903564, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903577, tzinfo=datetime.timezone.utc))} (T+49443070 ms) 2026-03-25 11:12:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49443071 ms) 2026-03-25 11:12:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49443071 ms) 2026-03-25 11:12:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 12, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774437147.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49440.001, raw_value=49440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 28, 900744, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903711, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903737, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903749, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903770, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903819, tzinfo=datetime.timezone.utc))} (T+49443075 ms) 2026-03-25 11:12:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 11, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774437087.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49380.001, raw_value=49380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903474, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903502, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903513, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903543, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903554, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903564, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 11, 30, 903577, tzinfo=datetime.timezone.utc))} (T+49443076 ms) 2026-03-25 11:13:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49503068 ms) 2026-03-25 11:13:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49503069 ms) 2026-03-25 11:13:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 13, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774437207.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49500.001, raw_value=49500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 28, 901465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904413, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904440, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904451, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904493, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904518, tzinfo=datetime.timezone.utc))} (T+49503070 ms) 2026-03-25 11:13:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 12, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774437147.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49440.001, raw_value=49440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 28, 900744, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903711, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903737, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903749, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903770, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903819, tzinfo=datetime.timezone.utc))} (T+49503070 ms) 2026-03-25 11:13:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49503071 ms) 2026-03-25 11:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49503071 ms) 2026-03-25 11:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 13, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774437207.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49500.001, raw_value=49500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 28, 901465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904413, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904440, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904451, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904493, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904518, tzinfo=datetime.timezone.utc))} (T+49503072 ms) 2026-03-25 11:13:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 12, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774437147.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878307, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49440.001, raw_value=49440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 28, 900744, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903711, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903737, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903749, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903759, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903770, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903791, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 12, 30, 903819, tzinfo=datetime.timezone.utc))} (T+49503072 ms) 2026-03-25 11:14:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49563068 ms) 2026-03-25 11:14:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49563068 ms) 2026-03-25 11:14:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774437267.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49560.001, raw_value=49560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903426, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903437, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903450, tzinfo=datetime.timezone.utc))} (T+49563069 ms) 2026-03-25 11:14:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 13, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774437207.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49500.001, raw_value=49500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 28, 901465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904413, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904440, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904451, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904493, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904518, tzinfo=datetime.timezone.utc))} (T+49563070 ms) 2026-03-25 11:14:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49563071 ms) 2026-03-25 11:14:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49563071 ms) 2026-03-25 11:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774437267.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49560.001, raw_value=49560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903426, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903437, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903450, tzinfo=datetime.timezone.utc))} (T+49563071 ms) 2026-03-25 11:14:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 13, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774437207.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49500.001, raw_value=49500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 28, 901465, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904413, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904440, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904451, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904493, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 13, 30, 904518, tzinfo=datetime.timezone.utc))} (T+49563072 ms) 2026-03-25 11:15:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49623068 ms) 2026-03-25 11:15:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49623068 ms) 2026-03-25 11:15:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 15, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774437327.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49620.001, raw_value=49620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904002, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904031, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904043, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904054, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904064, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904101, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904115, tzinfo=datetime.timezone.utc))} (T+49623069 ms) 2026-03-25 11:15:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774437267.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49560.001, raw_value=49560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903426, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903437, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903450, tzinfo=datetime.timezone.utc))} (T+49623070 ms) 2026-03-25 11:15:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49623071 ms) 2026-03-25 11:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49623071 ms) 2026-03-25 11:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 15, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774437327.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49620.001, raw_value=49620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904002, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904031, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904043, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904054, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904064, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904101, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904115, tzinfo=datetime.timezone.utc))} (T+49623072 ms) 2026-03-25 11:15:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774437267.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49560.001, raw_value=49560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903333, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903410, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903426, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903437, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 14, 30, 903450, tzinfo=datetime.timezone.utc))} (T+49623072 ms) 2026-03-25 11:16:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49683067 ms) 2026-03-25 11:16:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49683068 ms) 2026-03-25 11:16:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 16, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774437387.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49680.001, raw_value=49680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 28, 900420, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903419, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903505, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903531, tzinfo=datetime.timezone.utc))} (T+49683071 ms) 2026-03-25 11:16:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 15, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774437327.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49620.001, raw_value=49620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904002, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904031, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904043, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904054, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904064, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904101, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904115, tzinfo=datetime.timezone.utc))} (T+49683072 ms) 2026-03-25 11:16:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49683073 ms) 2026-03-25 11:16:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49683073 ms) 2026-03-25 11:16:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 16, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774437387.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49680.001, raw_value=49680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 28, 900420, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903419, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903505, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903531, tzinfo=datetime.timezone.utc))} (T+49683077 ms) 2026-03-25 11:16:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 15, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774437327.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49620.001, raw_value=49620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904002, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904031, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904043, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904054, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904064, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904090, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904101, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 15, 30, 904115, tzinfo=datetime.timezone.utc))} (T+49683078 ms) 2026-03-25 11:17:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49743067 ms) 2026-03-25 11:17:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49743068 ms) 2026-03-25 11:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 17, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774437447.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49740.001, raw_value=49740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 28, 900781, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903852, tzinfo=datetime.timezone.utc))} (T+49743070 ms) 2026-03-25 11:17:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 16, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774437387.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49680.001, raw_value=49680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 28, 900420, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903419, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903505, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903531, tzinfo=datetime.timezone.utc))} (T+49743071 ms) 2026-03-25 11:17:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49743071 ms) 2026-03-25 11:17:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49743071 ms) 2026-03-25 11:17:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 17, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774437447.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49740.001, raw_value=49740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 28, 900781, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903852, tzinfo=datetime.timezone.utc))} (T+49743075 ms) 2026-03-25 11:17:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 16, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774437387.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49680.001, raw_value=49680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 28, 900420, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903419, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903505, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 16, 30, 903531, tzinfo=datetime.timezone.utc))} (T+49743076 ms) 2026-03-25 11:18:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49803067 ms) 2026-03-25 11:18:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49803067 ms) 2026-03-25 11:18:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 18, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774437507.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49800.001, raw_value=49800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878554, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 28, 900057, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902940, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902967, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902982, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903003, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903012, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903056, tzinfo=datetime.timezone.utc))} (T+49803068 ms) 2026-03-25 11:18:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 17, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774437447.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49740.001, raw_value=49740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 28, 900781, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903852, tzinfo=datetime.timezone.utc))} (T+49803069 ms) 2026-03-25 11:18:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49803069 ms) 2026-03-25 11:18:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49803070 ms) 2026-03-25 11:18:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 18, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774437507.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49800.001, raw_value=49800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878554, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 28, 900057, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902940, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902967, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902982, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903003, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903012, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903056, tzinfo=datetime.timezone.utc))} (T+49803070 ms) 2026-03-25 11:18:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 17, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774437447.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49740.001, raw_value=49740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 28, 900781, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903744, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903772, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903784, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903826, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 17, 30, 903852, tzinfo=datetime.timezone.utc))} (T+49803071 ms) 2026-03-25 11:19:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49863067 ms) 2026-03-25 11:19:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49863068 ms) 2026-03-25 11:19:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 19, 27, 878149, tzinfo=datetime.timezone.utc), raw_value=1774437567.878149, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49860.001, raw_value=49860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 28, 900295, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903312, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903322, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903372, tzinfo=datetime.timezone.utc))} (T+49863069 ms) 2026-03-25 11:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 18, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774437507.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49800.001, raw_value=49800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878554, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 28, 900057, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902940, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902967, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902982, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903003, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903012, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903056, tzinfo=datetime.timezone.utc))} (T+49863070 ms) 2026-03-25 11:19:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49863071 ms) 2026-03-25 11:19:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49863071 ms) 2026-03-25 11:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 19, 27, 878149, tzinfo=datetime.timezone.utc), raw_value=1774437567.878149, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49860.001, raw_value=49860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 28, 900295, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903312, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903322, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903372, tzinfo=datetime.timezone.utc))} (T+49863072 ms) 2026-03-25 11:19:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 18, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774437507.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49800.001, raw_value=49800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 27, 878554, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 28, 900057, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902940, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902967, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902982, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 902993, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903003, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903012, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903026, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903040, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 18, 30, 903056, tzinfo=datetime.timezone.utc))} (T+49863072 ms) 2026-03-25 11:20:30.903 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49923065 ms) 2026-03-25 11:20:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49923066 ms) 2026-03-25 11:20:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 20, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774437627.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49920.001, raw_value=49920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 28, 900225, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901369, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901397, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901408, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901429, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901439, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901450, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901460, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901474, tzinfo=datetime.timezone.utc))} (T+49923066 ms) 2026-03-25 11:20:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 19, 27, 878149, tzinfo=datetime.timezone.utc), raw_value=1774437567.878149, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49860.001, raw_value=49860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 28, 900295, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903312, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903322, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903372, tzinfo=datetime.timezone.utc))} (T+49923067 ms) 2026-03-25 11:20:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49923068 ms) 2026-03-25 11:20:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49923068 ms) 2026-03-25 11:20:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 20, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774437627.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49920.001, raw_value=49920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 28, 900225, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901369, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901397, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901408, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901429, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901439, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901450, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901460, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901474, tzinfo=datetime.timezone.utc))} (T+49923069 ms) 2026-03-25 11:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 19, 27, 878149, tzinfo=datetime.timezone.utc), raw_value=1774437567.878149, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49860.001, raw_value=49860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 28, 900295, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903262, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903291, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903302, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903312, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903322, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903332, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 19, 30, 903372, tzinfo=datetime.timezone.utc))} (T+49923069 ms) 2026-03-25 11:21:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+49983068 ms) 2026-03-25 11:21:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+49983069 ms) 2026-03-25 11:21:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 21, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774437687.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49980.001, raw_value=49980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 28, 901267, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904227, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904256, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904267, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904277, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904318, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904331, tzinfo=datetime.timezone.utc))} (T+49983069 ms) 2026-03-25 11:21:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 20, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774437627.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49920.001, raw_value=49920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 28, 900225, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901369, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901397, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901408, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901429, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901439, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901450, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901460, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901474, tzinfo=datetime.timezone.utc))} (T+49983070 ms) 2026-03-25 11:21:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+49983071 ms) 2026-03-25 11:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+49983071 ms) 2026-03-25 11:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 21, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774437687.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49980.001, raw_value=49980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 28, 901267, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904227, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904256, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904267, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904277, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904318, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904331, tzinfo=datetime.timezone.utc))} (T+49983072 ms) 2026-03-25 11:21:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 20, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774437627.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49920.001, raw_value=49920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 28, 900225, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901369, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901397, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901408, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901429, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901439, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901450, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901460, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 20, 30, 901474, tzinfo=datetime.timezone.utc))} (T+49983073 ms) 2026-03-25 11:22:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50043067 ms) 2026-03-25 11:22:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50043068 ms) 2026-03-25 11:22:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 22, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774437747.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50040.001, raw_value=50040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903415, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903430, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903441, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903466, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903506, tzinfo=datetime.timezone.utc))} (T+50043069 ms) 2026-03-25 11:22:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 21, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774437687.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49980.001, raw_value=49980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 28, 901267, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904227, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904256, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904267, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904277, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904318, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904331, tzinfo=datetime.timezone.utc))} (T+50043070 ms) 2026-03-25 11:22:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50043070 ms) 2026-03-25 11:22:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50043071 ms) 2026-03-25 11:22:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 22, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774437747.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50040.001, raw_value=50040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903415, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903430, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903441, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903466, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903506, tzinfo=datetime.timezone.utc))} (T+50043071 ms) 2026-03-25 11:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 21, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774437687.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=49980.001, raw_value=49980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 28, 901267, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904227, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904256, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904267, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904277, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904318, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 21, 30, 904331, tzinfo=datetime.timezone.utc))} (T+50043072 ms) 2026-03-25 11:23:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50103067 ms) 2026-03-25 11:23:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50103067 ms) 2026-03-25 11:23:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 23, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774437807.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50100.001, raw_value=50100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 28, 899878, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902847, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902876, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902888, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902908, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902918, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902929, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902943, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902957, tzinfo=datetime.timezone.utc))} (T+50103068 ms) 2026-03-25 11:23:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 22, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774437747.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50040.001, raw_value=50040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903415, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903430, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903441, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903466, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903506, tzinfo=datetime.timezone.utc))} (T+50103069 ms) 2026-03-25 11:23:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50103070 ms) 2026-03-25 11:23:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50103070 ms) 2026-03-25 11:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 23, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774437807.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50100.001, raw_value=50100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 28, 899878, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902847, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902876, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902888, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902908, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902918, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902929, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902943, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902957, tzinfo=datetime.timezone.utc))} (T+50103070 ms) 2026-03-25 11:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 22, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774437747.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50040.001, raw_value=50040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 28, 900353, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903415, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903430, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903441, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903452, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903466, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903487, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 22, 30, 903506, tzinfo=datetime.timezone.utc))} (T+50103071 ms) 2026-03-25 11:24:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50163068 ms) 2026-03-25 11:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50163068 ms) 2026-03-25 11:24:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774437867.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50160.001, raw_value=50160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 28, 901105, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904083, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904111, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904122, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904133, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904143, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904153, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904164, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904173, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904186, tzinfo=datetime.timezone.utc))} (T+50163069 ms) 2026-03-25 11:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 23, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774437807.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50100.001, raw_value=50100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 28, 899878, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902847, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902876, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902888, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902908, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902918, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902929, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902943, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902957, tzinfo=datetime.timezone.utc))} (T+50163070 ms) 2026-03-25 11:24:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50163071 ms) 2026-03-25 11:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50163071 ms) 2026-03-25 11:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774437867.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50160.001, raw_value=50160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 28, 901105, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904083, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904111, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904122, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904133, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904143, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904153, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904164, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904173, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904186, tzinfo=datetime.timezone.utc))} (T+50163072 ms) 2026-03-25 11:24:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 23, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774437807.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50100.001, raw_value=50100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 28, 899878, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902847, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902876, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902888, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902908, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902918, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902929, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902943, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 23, 30, 902957, tzinfo=datetime.timezone.utc))} (T+50163072 ms) 2026-03-25 11:25:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50223067 ms) 2026-03-25 11:25:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50223068 ms) 2026-03-25 11:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 25, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774437927.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50220.001, raw_value=50220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903616, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903676, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903687, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903708, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903724, tzinfo=datetime.timezone.utc))} (T+50223069 ms) 2026-03-25 11:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774437867.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50160.001, raw_value=50160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 28, 901105, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904083, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904111, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904122, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904133, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904143, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904153, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904164, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904173, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904186, tzinfo=datetime.timezone.utc))} (T+50223071 ms) 2026-03-25 11:25:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50223072 ms) 2026-03-25 11:25:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50223072 ms) 2026-03-25 11:25:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 25, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774437927.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50220.001, raw_value=50220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903616, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903676, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903687, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903708, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903724, tzinfo=datetime.timezone.utc))} (T+50223076 ms) 2026-03-25 11:25:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774437867.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50160.001, raw_value=50160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 28, 901105, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904083, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904111, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904122, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904133, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904143, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904153, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904164, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904173, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 24, 30, 904186, tzinfo=datetime.timezone.utc))} (T+50223077 ms) 2026-03-25 11:26:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50283067 ms) 2026-03-25 11:26:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50283068 ms) 2026-03-25 11:26:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774437987.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50280.001, raw_value=50280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 28, 900635, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903625, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903653, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903668, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903710, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903736, tzinfo=datetime.timezone.utc))} (T+50283069 ms) 2026-03-25 11:26:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 25, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774437927.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50220.001, raw_value=50220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903616, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903676, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903687, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903708, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903724, tzinfo=datetime.timezone.utc))} (T+50283070 ms) 2026-03-25 11:26:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50283071 ms) 2026-03-25 11:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50283071 ms) 2026-03-25 11:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774437987.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50280.001, raw_value=50280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 28, 900635, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903625, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903653, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903668, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903710, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903736, tzinfo=datetime.timezone.utc))} (T+50283072 ms) 2026-03-25 11:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 25, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774437927.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50220.001, raw_value=50220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 28, 900636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903616, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903643, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903655, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903676, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903687, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903708, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 25, 30, 903724, tzinfo=datetime.timezone.utc))} (T+50283073 ms) 2026-03-25 11:27:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50343068 ms) 2026-03-25 11:27:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50343068 ms) 2026-03-25 11:27:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 27, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438047.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50340.001, raw_value=50340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903759, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903791, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903812, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903822, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903837, tzinfo=datetime.timezone.utc))} (T+50343069 ms) 2026-03-25 11:27:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774437987.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50280.001, raw_value=50280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 28, 900635, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903625, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903653, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903668, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903710, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903736, tzinfo=datetime.timezone.utc))} (T+50343070 ms) 2026-03-25 11:27:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50343071 ms) 2026-03-25 11:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50343071 ms) 2026-03-25 11:27:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 27, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438047.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50340.001, raw_value=50340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903759, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903791, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903812, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903822, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903837, tzinfo=datetime.timezone.utc))} (T+50343073 ms) 2026-03-25 11:27:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 26, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774437987.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50280.001, raw_value=50280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 28, 900635, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903625, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903653, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903668, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903690, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903700, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903710, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 26, 30, 903736, tzinfo=datetime.timezone.utc))} (T+50343073 ms) 2026-03-25 11:28:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50403068 ms) 2026-03-25 11:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50403069 ms) 2026-03-25 11:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 28, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774438107.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50400.001, raw_value=50400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 28, 901174, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904182, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904222, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904232, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904274, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904290, tzinfo=datetime.timezone.utc))} (T+50403070 ms) 2026-03-25 11:28:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 27, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438047.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50340.001, raw_value=50340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903759, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903791, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903812, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903822, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903837, tzinfo=datetime.timezone.utc))} (T+50403071 ms) 2026-03-25 11:28:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50403072 ms) 2026-03-25 11:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50403072 ms) 2026-03-25 11:28:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 28, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774438107.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50400.001, raw_value=50400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 28, 901174, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904182, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904222, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904232, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904274, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904290, tzinfo=datetime.timezone.utc))} (T+50403073 ms) 2026-03-25 11:28:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 27, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438047.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50340.001, raw_value=50340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903759, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903791, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903801, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903812, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903822, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 27, 30, 903837, tzinfo=datetime.timezone.utc))} (T+50403074 ms) 2026-03-25 11:29:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50463067 ms) 2026-03-25 11:29:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50463068 ms) 2026-03-25 11:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 29, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774438167.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50460.001, raw_value=50460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 28, 900468, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903449, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903478, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903558, tzinfo=datetime.timezone.utc))} (T+50463069 ms) 2026-03-25 11:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 28, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774438107.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50400.001, raw_value=50400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 28, 901174, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904182, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904222, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904232, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904274, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904290, tzinfo=datetime.timezone.utc))} (T+50463070 ms) 2026-03-25 11:29:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50463070 ms) 2026-03-25 11:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50463071 ms) 2026-03-25 11:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 29, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774438167.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50460.001, raw_value=50460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 28, 900468, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903449, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903478, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903558, tzinfo=datetime.timezone.utc))} (T+50463072 ms) 2026-03-25 11:29:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 28, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774438107.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50400.001, raw_value=50400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 27, 878530, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 28, 901174, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904182, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904222, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904232, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904274, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 28, 30, 904290, tzinfo=datetime.timezone.utc))} (T+50463073 ms) 2026-03-25 11:30:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50523068 ms) 2026-03-25 11:30:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50523068 ms) 2026-03-25 11:30:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 30, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438227.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50520.001, raw_value=50520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 28, 900641, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903640, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903669, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903727, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903753, tzinfo=datetime.timezone.utc))} (T+50523069 ms) 2026-03-25 11:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 29, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774438167.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50460.001, raw_value=50460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 28, 900468, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903449, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903478, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903558, tzinfo=datetime.timezone.utc))} (T+50523070 ms) 2026-03-25 11:30:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50523071 ms) 2026-03-25 11:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50523071 ms) 2026-03-25 11:30:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 30, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438227.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50520.001, raw_value=50520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 28, 900641, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903640, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903669, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903727, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903753, tzinfo=datetime.timezone.utc))} (T+50523072 ms) 2026-03-25 11:30:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 29, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774438167.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50460.001, raw_value=50460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 28, 900468, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903449, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903478, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903489, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903510, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903520, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903531, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 29, 30, 903558, tzinfo=datetime.timezone.utc))} (T+50523073 ms) 2026-03-25 11:31:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50583068 ms) 2026-03-25 11:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50583069 ms) 2026-03-25 11:31:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 31, 27, 878236, tzinfo=datetime.timezone.utc), raw_value=1774438287.878236, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50580.001, raw_value=50580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 28, 901315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904354, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904366, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904376, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904386, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904413, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904438, tzinfo=datetime.timezone.utc))} (T+50583070 ms) 2026-03-25 11:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 30, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438227.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50520.001, raw_value=50520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 28, 900641, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903640, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903669, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903727, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903753, tzinfo=datetime.timezone.utc))} (T+50583070 ms) 2026-03-25 11:31:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50583071 ms) 2026-03-25 11:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50583071 ms) 2026-03-25 11:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 31, 27, 878236, tzinfo=datetime.timezone.utc), raw_value=1774438287.878236, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50580.001, raw_value=50580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 28, 901315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904354, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904366, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904376, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904386, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904413, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904438, tzinfo=datetime.timezone.utc))} (T+50583072 ms) 2026-03-25 11:31:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 30, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438227.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50520.001, raw_value=50520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 28, 900641, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903640, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903669, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903684, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903695, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903727, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 30, 30, 903753, tzinfo=datetime.timezone.utc))} (T+50583073 ms) 2026-03-25 11:32:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50643067 ms) 2026-03-25 11:32:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50643068 ms) 2026-03-25 11:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 32, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438347.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50640.001, raw_value=50640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 28, 900564, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903592, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903621, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903633, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903663, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903702, tzinfo=datetime.timezone.utc))} (T+50643070 ms) 2026-03-25 11:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 31, 27, 878236, tzinfo=datetime.timezone.utc), raw_value=1774438287.878236, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50580.001, raw_value=50580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 28, 901315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904354, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904366, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904376, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904386, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904413, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904438, tzinfo=datetime.timezone.utc))} (T+50643071 ms) 2026-03-25 11:32:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50643071 ms) 2026-03-25 11:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50643071 ms) 2026-03-25 11:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 32, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438347.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50640.001, raw_value=50640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 28, 900564, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903592, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903621, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903633, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903663, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903702, tzinfo=datetime.timezone.utc))} (T+50643072 ms) 2026-03-25 11:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 31, 27, 878236, tzinfo=datetime.timezone.utc), raw_value=1774438287.878236, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50580.001, raw_value=50580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 27, 878608, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 28, 901315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904354, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904366, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904376, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904386, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904413, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904423, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 31, 30, 904438, tzinfo=datetime.timezone.utc))} (T+50643073 ms) 2026-03-25 11:33:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50703068 ms) 2026-03-25 11:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50703069 ms) 2026-03-25 11:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 33, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774438407.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50700.001, raw_value=50700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 28, 901053, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904086, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904119, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904131, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904141, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904174, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904185, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904199, tzinfo=datetime.timezone.utc))} (T+50703069 ms) 2026-03-25 11:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 32, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438347.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50640.001, raw_value=50640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 28, 900564, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903592, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903621, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903633, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903663, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903702, tzinfo=datetime.timezone.utc))} (T+50703070 ms) 2026-03-25 11:33:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50703071 ms) 2026-03-25 11:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50703071 ms) 2026-03-25 11:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 33, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774438407.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50700.001, raw_value=50700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 28, 901053, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904086, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904119, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904131, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904141, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904174, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904185, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904199, tzinfo=datetime.timezone.utc))} (T+50703072 ms) 2026-03-25 11:33:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 32, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438347.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50640.001, raw_value=50640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 28, 900564, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903592, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903621, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903633, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903663, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 32, 30, 903702, tzinfo=datetime.timezone.utc))} (T+50703073 ms) 2026-03-25 11:34:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50763068 ms) 2026-03-25 11:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50763069 ms) 2026-03-25 11:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 34, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774438467.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50760.001, raw_value=50760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 28, 901450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904476, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904503, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904518, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904563, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904574, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904588, tzinfo=datetime.timezone.utc))} (T+50763069 ms) 2026-03-25 11:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 33, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774438407.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50700.001, raw_value=50700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 28, 901053, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904086, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904119, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904131, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904141, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904174, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904185, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904199, tzinfo=datetime.timezone.utc))} (T+50763070 ms) 2026-03-25 11:34:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50763071 ms) 2026-03-25 11:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50763071 ms) 2026-03-25 11:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 34, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774438467.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50760.001, raw_value=50760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 28, 901450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904476, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904503, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904518, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904563, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904574, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904588, tzinfo=datetime.timezone.utc))} (T+50763072 ms) 2026-03-25 11:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 33, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774438407.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50700.001, raw_value=50700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 28, 901053, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904086, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904119, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904131, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904141, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904162, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904174, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904185, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 33, 30, 904199, tzinfo=datetime.timezone.utc))} (T+50763072 ms) 2026-03-25 11:35:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50823068 ms) 2026-03-25 11:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50823068 ms) 2026-03-25 11:35:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 35, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774438527.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50820.001, raw_value=50820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 28, 900964, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903951, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903983, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903995, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904007, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904055, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904071, tzinfo=datetime.timezone.utc))} (T+50823070 ms) 2026-03-25 11:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 34, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774438467.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50760.001, raw_value=50760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 28, 901450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904476, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904503, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904518, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904563, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904574, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904588, tzinfo=datetime.timezone.utc))} (T+50823071 ms) 2026-03-25 11:35:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50823072 ms) 2026-03-25 11:35:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50823072 ms) 2026-03-25 11:35:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 35, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774438527.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50820.001, raw_value=50820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 28, 900964, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903951, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903983, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903995, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904007, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904055, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904071, tzinfo=datetime.timezone.utc))} (T+50823077 ms) 2026-03-25 11:35:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 34, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774438467.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50760.001, raw_value=50760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 28, 901450, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904476, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904503, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904518, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904529, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904539, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904549, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904563, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904574, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 34, 30, 904588, tzinfo=datetime.timezone.utc))} (T+50823077 ms) 2026-03-25 11:36:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50883070 ms) 2026-03-25 11:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50883070 ms) 2026-03-25 11:36:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438587.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50880.001, raw_value=50880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 28, 902834, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905798, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905809, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905820, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905830, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905840, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905852, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905863, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905881, tzinfo=datetime.timezone.utc))} (T+50883072 ms) 2026-03-25 11:36:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 35, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774438527.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50820.001, raw_value=50820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 28, 900964, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903951, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903983, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903995, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904007, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904055, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904071, tzinfo=datetime.timezone.utc))} (T+50883073 ms) 2026-03-25 11:36:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50883074 ms) 2026-03-25 11:36:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50883074 ms) 2026-03-25 11:36:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438587.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50880.001, raw_value=50880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 28, 902834, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905798, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905809, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905820, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905830, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905840, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905852, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905863, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905881, tzinfo=datetime.timezone.utc))} (T+50883078 ms) 2026-03-25 11:36:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 35, 27, 878188, tzinfo=datetime.timezone.utc), raw_value=1774438527.878188, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50820.001, raw_value=50820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 28, 900964, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903951, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903983, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 903995, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904007, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904040, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904055, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 35, 30, 904071, tzinfo=datetime.timezone.utc))} (T+50883079 ms) 2026-03-25 11:37:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+50943069 ms) 2026-03-25 11:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+50943070 ms) 2026-03-25 11:37:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 37, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438647.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50940.001, raw_value=50940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 28, 902572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905599, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905610, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905621, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905631, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905642, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905664, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905680, tzinfo=datetime.timezone.utc))} (T+50943073 ms) 2026-03-25 11:37:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438587.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50880.001, raw_value=50880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 28, 902834, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905798, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905809, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905820, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905830, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905840, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905852, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905863, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905881, tzinfo=datetime.timezone.utc))} (T+50943074 ms) 2026-03-25 11:37:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+50943075 ms) 2026-03-25 11:37:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+50943075 ms) 2026-03-25 11:37:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 37, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438647.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50940.001, raw_value=50940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 28, 902572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905599, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905610, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905621, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905631, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905642, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905664, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905680, tzinfo=datetime.timezone.utc))} (T+50943084 ms) 2026-03-25 11:37:30.923 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 36, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438587.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50880.001, raw_value=50880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 28, 902834, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905798, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905809, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905820, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905830, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905840, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905852, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905863, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 36, 30, 905881, tzinfo=datetime.timezone.utc))} (T+50943084 ms) 2026-03-25 11:38:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51003068 ms) 2026-03-25 11:38:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51003068 ms) 2026-03-25 11:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 38, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774438707.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51000.001, raw_value=51000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 28, 900498, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903565, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903596, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903685, tzinfo=datetime.timezone.utc))} (T+51003072 ms) 2026-03-25 11:38:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 37, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438647.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50940.001, raw_value=50940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 28, 902572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905599, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905610, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905621, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905631, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905642, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905664, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905680, tzinfo=datetime.timezone.utc))} (T+51003073 ms) 2026-03-25 11:38:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51003073 ms) 2026-03-25 11:38:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51003073 ms) 2026-03-25 11:38:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 38, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774438707.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51000.001, raw_value=51000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 28, 900498, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903565, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903596, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903685, tzinfo=datetime.timezone.utc))} (T+51003081 ms) 2026-03-25 11:38:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 37, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774438647.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=50940.001, raw_value=50940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 28, 902572, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905563, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905599, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905610, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905621, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905631, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905642, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905664, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 37, 30, 905680, tzinfo=datetime.timezone.utc))} (T+51003082 ms) 2026-03-25 11:39:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51063068 ms) 2026-03-25 11:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51063068 ms) 2026-03-25 11:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 39, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774438767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51060.001, raw_value=51060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 28, 901154, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904113, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904164, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904194, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904204, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904220, tzinfo=datetime.timezone.utc))} (T+51063069 ms) 2026-03-25 11:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 38, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774438707.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51000.001, raw_value=51000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 28, 900498, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903565, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903596, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903685, tzinfo=datetime.timezone.utc))} (T+51063070 ms) 2026-03-25 11:39:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51063071 ms) 2026-03-25 11:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51063071 ms) 2026-03-25 11:39:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 39, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774438767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51060.001, raw_value=51060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 28, 901154, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904113, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904164, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904194, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904204, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904220, tzinfo=datetime.timezone.utc))} (T+51063079 ms) 2026-03-25 11:39:30.918 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 38, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774438707.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51000.001, raw_value=51000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 28, 900498, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903565, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903596, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903669, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 38, 30, 903685, tzinfo=datetime.timezone.utc))} (T+51063080 ms) 2026-03-25 11:40:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51123068 ms) 2026-03-25 11:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51123068 ms) 2026-03-25 11:40:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 40, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774438827.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51120.001, raw_value=51120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 28, 900571, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903663, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903693, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903781, tzinfo=datetime.timezone.utc))} (T+51123073 ms) 2026-03-25 11:40:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 39, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774438767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51060.001, raw_value=51060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 28, 901154, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904113, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904164, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904194, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904204, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904220, tzinfo=datetime.timezone.utc))} (T+51123074 ms) 2026-03-25 11:40:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51123074 ms) 2026-03-25 11:40:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51123075 ms) 2026-03-25 11:40:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 40, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774438827.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51120.001, raw_value=51120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 28, 900571, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903663, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903693, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903781, tzinfo=datetime.timezone.utc))} (T+51123082 ms) 2026-03-25 11:40:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 39, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774438767.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878319, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51060.001, raw_value=51060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 28, 901154, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904113, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904164, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904183, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904194, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904204, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 39, 30, 904220, tzinfo=datetime.timezone.utc))} (T+51123083 ms) 2026-03-25 11:41:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51183068 ms) 2026-03-25 11:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51183068 ms) 2026-03-25 11:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 41, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774438887.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878237, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51180.001, raw_value=51180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 28, 900791, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903798, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903838, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903868, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903889, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903905, tzinfo=datetime.timezone.utc))} (T+51183070 ms) 2026-03-25 11:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 40, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774438827.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51120.001, raw_value=51120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 28, 900571, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903663, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903693, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903781, tzinfo=datetime.timezone.utc))} (T+51183071 ms) 2026-03-25 11:41:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51183072 ms) 2026-03-25 11:41:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51183072 ms) 2026-03-25 11:41:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 41, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774438887.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878237, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51180.001, raw_value=51180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 28, 900791, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903798, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903838, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903868, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903889, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903905, tzinfo=datetime.timezone.utc))} (T+51183076 ms) 2026-03-25 11:41:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 40, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774438827.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51120.001, raw_value=51120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 28, 900571, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903663, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903693, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903715, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903725, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 40, 30, 903781, tzinfo=datetime.timezone.utc))} (T+51183077 ms) 2026-03-25 11:42:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51243069 ms) 2026-03-25 11:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51243069 ms) 2026-03-25 11:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 42, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438947.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51240.001, raw_value=51240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 28, 902515, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905344, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905372, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905387, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905419, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905430, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905456, tzinfo=datetime.timezone.utc))} (T+51243071 ms) 2026-03-25 11:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 41, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774438887.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878237, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51180.001, raw_value=51180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 28, 900791, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903798, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903838, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903868, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903889, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903905, tzinfo=datetime.timezone.utc))} (T+51243071 ms) 2026-03-25 11:42:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51243072 ms) 2026-03-25 11:42:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51243072 ms) 2026-03-25 11:42:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 42, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438947.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51240.001, raw_value=51240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 28, 902515, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905344, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905372, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905387, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905419, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905430, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905456, tzinfo=datetime.timezone.utc))} (T+51243074 ms) 2026-03-25 11:42:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 41, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774438887.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878237, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51180.001, raw_value=51180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 28, 900791, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903798, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903838, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903848, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903868, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903889, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 41, 30, 903905, tzinfo=datetime.timezone.utc))} (T+51243075 ms) 2026-03-25 11:43:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51303068 ms) 2026-03-25 11:43:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51303068 ms) 2026-03-25 11:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 43, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439007.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878351, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51300.001, raw_value=51300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 28, 900823, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903836, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903875, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903886, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903896, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903906, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903931, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903949, tzinfo=datetime.timezone.utc))} (T+51303069 ms) 2026-03-25 11:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 42, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438947.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51240.001, raw_value=51240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 28, 902515, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905344, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905372, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905387, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905419, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905430, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905456, tzinfo=datetime.timezone.utc))} (T+51303070 ms) 2026-03-25 11:43:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51303071 ms) 2026-03-25 11:43:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51303071 ms) 2026-03-25 11:43:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 43, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439007.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878351, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51300.001, raw_value=51300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 28, 900823, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903836, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903875, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903886, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903896, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903906, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903931, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903949, tzinfo=datetime.timezone.utc))} (T+51303072 ms) 2026-03-25 11:43:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 42, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774438947.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51240.001, raw_value=51240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 28, 902515, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905344, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905372, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905387, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905419, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905430, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 42, 30, 905456, tzinfo=datetime.timezone.utc))} (T+51303073 ms) 2026-03-25 11:44:30.904 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51363065 ms) 2026-03-25 11:44:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51363066 ms) 2026-03-25 11:44:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 44, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774439067.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51360.001, raw_value=51360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 28, 900316, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901359, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901370, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901380, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901441, tzinfo=datetime.timezone.utc))} (T+51363067 ms) 2026-03-25 11:44:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 43, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439007.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878351, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51300.001, raw_value=51300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 28, 900823, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903836, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903875, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903886, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903896, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903906, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903931, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903949, tzinfo=datetime.timezone.utc))} (T+51363068 ms) 2026-03-25 11:44:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51363068 ms) 2026-03-25 11:44:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51363069 ms) 2026-03-25 11:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 44, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774439067.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51360.001, raw_value=51360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 28, 900316, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901359, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901370, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901380, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901441, tzinfo=datetime.timezone.utc))} (T+51363070 ms) 2026-03-25 11:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 43, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439007.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878351, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51300.001, raw_value=51300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 27, 878590, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 28, 900823, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903836, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903864, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903875, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903886, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903896, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903906, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903931, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 43, 30, 903949, tzinfo=datetime.timezone.utc))} (T+51363071 ms) 2026-03-25 11:45:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51423069 ms) 2026-03-25 11:45:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51423069 ms) 2026-03-25 11:45:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 45, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774439127.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51420.001, raw_value=51420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 28, 901575, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904645, tzinfo=datetime.timezone.utc))} (T+51423072 ms) 2026-03-25 11:45:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 44, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774439067.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51360.001, raw_value=51360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 28, 900316, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901359, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901370, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901380, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901441, tzinfo=datetime.timezone.utc))} (T+51423073 ms) 2026-03-25 11:45:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51423074 ms) 2026-03-25 11:45:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51423074 ms) 2026-03-25 11:45:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 45, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774439127.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51420.001, raw_value=51420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 28, 901575, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904645, tzinfo=datetime.timezone.utc))} (T+51423083 ms) 2026-03-25 11:45:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 44, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774439067.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51360.001, raw_value=51360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 28, 900316, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901330, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901359, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901370, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901380, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901404, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 44, 30, 901441, tzinfo=datetime.timezone.utc))} (T+51423083 ms) 2026-03-25 11:46:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51483068 ms) 2026-03-25 11:46:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51483069 ms) 2026-03-25 11:46:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 46, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774439187.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51480.001, raw_value=51480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 28, 901394, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904376, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904431, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904441, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904451, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904462, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904472, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904487, tzinfo=datetime.timezone.utc))} (T+51483070 ms) 2026-03-25 11:46:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 45, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774439127.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51420.001, raw_value=51420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 28, 901575, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904645, tzinfo=datetime.timezone.utc))} (T+51483071 ms) 2026-03-25 11:46:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51483072 ms) 2026-03-25 11:46:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51483072 ms) 2026-03-25 11:46:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 46, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774439187.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51480.001, raw_value=51480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 28, 901394, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904376, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904431, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904441, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904451, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904462, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904472, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904487, tzinfo=datetime.timezone.utc))} (T+51483074 ms) 2026-03-25 11:46:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 45, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774439127.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51420.001, raw_value=51420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 28, 901575, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904539, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904577, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904629, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 45, 30, 904645, tzinfo=datetime.timezone.utc))} (T+51483074 ms) 2026-03-25 11:47:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51543068 ms) 2026-03-25 11:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51543068 ms) 2026-03-25 11:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 47, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774439247.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51540.001, raw_value=51540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 28, 900961, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903959, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904001, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904045, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904056, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904073, tzinfo=datetime.timezone.utc))} (T+51543070 ms) 2026-03-25 11:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 46, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774439187.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51480.001, raw_value=51480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 28, 901394, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904376, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904431, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904441, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904451, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904462, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904472, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904487, tzinfo=datetime.timezone.utc))} (T+51543071 ms) 2026-03-25 11:47:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51543072 ms) 2026-03-25 11:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51543072 ms) 2026-03-25 11:47:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 47, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774439247.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51540.001, raw_value=51540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 28, 900961, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903959, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904001, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904045, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904056, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904073, tzinfo=datetime.timezone.utc))} (T+51543077 ms) 2026-03-25 11:47:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 46, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774439187.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51480.001, raw_value=51480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 28, 901394, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904376, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904405, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904431, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904441, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904451, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904462, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904472, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 46, 30, 904487, tzinfo=datetime.timezone.utc))} (T+51543078 ms) 2026-03-25 11:48:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51603067 ms) 2026-03-25 11:48:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51603068 ms) 2026-03-25 11:48:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 48, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774439307.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51600.001, raw_value=51600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 28, 900646, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903666, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903678, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903688, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903746, tzinfo=datetime.timezone.utc))} (T+51603069 ms) 2026-03-25 11:48:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 47, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774439247.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51540.001, raw_value=51540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 28, 900961, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903959, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904001, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904045, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904056, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904073, tzinfo=datetime.timezone.utc))} (T+51603070 ms) 2026-03-25 11:48:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51603071 ms) 2026-03-25 11:48:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51603071 ms) 2026-03-25 11:48:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 48, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774439307.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51600.001, raw_value=51600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 28, 900646, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903666, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903678, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903688, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903746, tzinfo=datetime.timezone.utc))} (T+51603072 ms) 2026-03-25 11:48:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 47, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774439247.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51540.001, raw_value=51540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 28, 900961, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903959, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 903988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904001, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904045, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904056, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 47, 30, 904073, tzinfo=datetime.timezone.utc))} (T+51603073 ms) 2026-03-25 11:49:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51663067 ms) 2026-03-25 11:49:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51663068 ms) 2026-03-25 11:49:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 49, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774439367.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51660.001, raw_value=51660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 28, 900253, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903203, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903243, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903254, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903264, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903285, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903312, tzinfo=datetime.timezone.utc))} (T+51663070 ms) 2026-03-25 11:49:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 48, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774439307.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51600.001, raw_value=51600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 28, 900646, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903666, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903678, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903688, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903746, tzinfo=datetime.timezone.utc))} (T+51663071 ms) 2026-03-25 11:49:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51663071 ms) 2026-03-25 11:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51663071 ms) 2026-03-25 11:49:30.918 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 49, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774439367.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51660.001, raw_value=51660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 28, 900253, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903203, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903243, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903254, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903264, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903285, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903312, tzinfo=datetime.timezone.utc))} (T+51663080 ms) 2026-03-25 11:49:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 48, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774439307.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878254, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51600.001, raw_value=51600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 27, 878470, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 28, 900646, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903638, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903666, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903678, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903688, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903698, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903720, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903730, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 48, 30, 903746, tzinfo=datetime.timezone.utc))} (T+51663081 ms) 2026-03-25 11:50:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51723067 ms) 2026-03-25 11:50:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51723068 ms) 2026-03-25 11:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 50, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774439427.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878262, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51720.001, raw_value=51720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903710, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903735, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903762, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903772, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903782, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903793, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903803, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903818, tzinfo=datetime.timezone.utc))} (T+51723069 ms) 2026-03-25 11:50:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 49, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774439367.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51660.001, raw_value=51660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 28, 900253, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903203, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903243, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903254, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903264, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903285, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903312, tzinfo=datetime.timezone.utc))} (T+51723070 ms) 2026-03-25 11:50:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51723071 ms) 2026-03-25 11:50:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51723071 ms) 2026-03-25 11:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 50, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774439427.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878262, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51720.001, raw_value=51720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903710, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903735, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903762, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903772, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903782, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903793, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903803, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903818, tzinfo=datetime.timezone.utc))} (T+51723071 ms) 2026-03-25 11:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 49, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774439367.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51660.001, raw_value=51660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 28, 900253, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903203, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903243, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903254, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903264, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903285, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 49, 30, 903312, tzinfo=datetime.timezone.utc))} (T+51723072 ms) 2026-03-25 11:51:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51783067 ms) 2026-03-25 11:51:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51783068 ms) 2026-03-25 11:51:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 51, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774439487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51780.001, raw_value=51780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 28, 900476, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903532, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903542, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903552, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903562, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903583, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903596, tzinfo=datetime.timezone.utc))} (T+51783069 ms) 2026-03-25 11:51:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 50, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774439427.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878262, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51720.001, raw_value=51720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903710, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903735, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903762, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903772, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903782, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903793, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903803, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903818, tzinfo=datetime.timezone.utc))} (T+51783070 ms) 2026-03-25 11:51:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51783071 ms) 2026-03-25 11:51:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51783071 ms) 2026-03-25 11:51:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 51, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774439487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51780.001, raw_value=51780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 28, 900476, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903532, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903542, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903552, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903562, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903583, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903596, tzinfo=datetime.timezone.utc))} (T+51783072 ms) 2026-03-25 11:51:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 50, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774439427.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878262, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51720.001, raw_value=51720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903710, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903735, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903751, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903762, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903772, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903782, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903793, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903803, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 50, 30, 903818, tzinfo=datetime.timezone.utc))} (T+51783073 ms) 2026-03-25 11:52:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51843068 ms) 2026-03-25 11:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51843068 ms) 2026-03-25 11:52:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 52, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774439547.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51840.001, raw_value=51840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904072, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904100, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904111, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904122, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904132, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904153, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904177, tzinfo=datetime.timezone.utc))} (T+51843069 ms) 2026-03-25 11:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 51, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774439487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51780.001, raw_value=51780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 28, 900476, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903532, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903542, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903552, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903562, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903583, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903596, tzinfo=datetime.timezone.utc))} (T+51843070 ms) 2026-03-25 11:52:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51843071 ms) 2026-03-25 11:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51843071 ms) 2026-03-25 11:52:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 52, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774439547.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51840.001, raw_value=51840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904072, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904100, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904111, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904122, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904132, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904153, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904177, tzinfo=datetime.timezone.utc))} (T+51843072 ms) 2026-03-25 11:52:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 51, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774439487.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51780.001, raw_value=51780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 27, 878570, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 28, 900476, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903493, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903520, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903532, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903542, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903552, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903562, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903573, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903583, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 51, 30, 903596, tzinfo=datetime.timezone.utc))} (T+51843073 ms) 2026-03-25 11:53:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51903067 ms) 2026-03-25 11:53:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51903068 ms) 2026-03-25 11:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 53, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774439607.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51900.001, raw_value=51900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903760, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903774, tzinfo=datetime.timezone.utc))} (T+51903070 ms) 2026-03-25 11:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 52, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774439547.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51840.001, raw_value=51840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904072, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904100, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904111, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904122, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904132, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904153, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904177, tzinfo=datetime.timezone.utc))} (T+51903071 ms) 2026-03-25 11:53:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51903071 ms) 2026-03-25 11:53:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51903072 ms) 2026-03-25 11:53:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 53, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774439607.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51900.001, raw_value=51900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903760, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903774, tzinfo=datetime.timezone.utc))} (T+51903076 ms) 2026-03-25 11:53:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 52, 27, 878165, tzinfo=datetime.timezone.utc), raw_value=1774439547.878165, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51840.001, raw_value=51840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904072, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904100, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904111, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904122, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904132, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904153, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 52, 30, 904177, tzinfo=datetime.timezone.utc))} (T+51903076 ms) 2026-03-25 11:54:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+51963069 ms) 2026-03-25 11:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+51963069 ms) 2026-03-25 11:54:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 54, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439667.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878365, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51960.001, raw_value=51960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878614, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 28, 901690, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904671, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904703, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904717, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904728, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904739, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904783, tzinfo=datetime.timezone.utc))} (T+51963070 ms) 2026-03-25 11:54:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 53, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774439607.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51900.001, raw_value=51900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903760, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903774, tzinfo=datetime.timezone.utc))} (T+51963071 ms) 2026-03-25 11:54:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+51963072 ms) 2026-03-25 11:54:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+51963072 ms) 2026-03-25 11:54:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 54, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439667.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878365, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51960.001, raw_value=51960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878614, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 28, 901690, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904671, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904703, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904717, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904728, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904739, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904783, tzinfo=datetime.timezone.utc))} (T+51963074 ms) 2026-03-25 11:54:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 53, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774439607.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51900.001, raw_value=51900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 28, 900657, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903694, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903705, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903716, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903726, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903760, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 53, 30, 903774, tzinfo=datetime.timezone.utc))} (T+51963074 ms) 2026-03-25 11:55:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52023068 ms) 2026-03-25 11:55:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52023069 ms) 2026-03-25 11:55:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 55, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774439727.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52020.001, raw_value=52020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 28, 901350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904395, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904439, tzinfo=datetime.timezone.utc))} (T+52023070 ms) 2026-03-25 11:55:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 54, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439667.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878365, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51960.001, raw_value=51960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878614, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 28, 901690, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904671, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904703, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904717, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904728, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904739, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904783, tzinfo=datetime.timezone.utc))} (T+52023072 ms) 2026-03-25 11:55:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52023073 ms) 2026-03-25 11:55:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52023073 ms) 2026-03-25 11:55:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 55, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774439727.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52020.001, raw_value=52020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 28, 901350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904395, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904439, tzinfo=datetime.timezone.utc))} (T+52023077 ms) 2026-03-25 11:55:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 54, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774439667.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878365, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=51960.001, raw_value=51960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 27, 878614, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 28, 901690, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904671, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904703, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904717, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904728, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904739, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904759, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 54, 30, 904783, tzinfo=datetime.timezone.utc))} (T+52023078 ms) 2026-03-25 11:56:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52083069 ms) 2026-03-25 11:56:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52083069 ms) 2026-03-25 11:56:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 56, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774439787.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52080.001, raw_value=52080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 28, 902830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905338, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905365, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905419, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905447, tzinfo=datetime.timezone.utc))} (T+52083073 ms) 2026-03-25 11:56:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 55, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774439727.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52020.001, raw_value=52020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 28, 901350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904395, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904439, tzinfo=datetime.timezone.utc))} (T+52083074 ms) 2026-03-25 11:56:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52083074 ms) 2026-03-25 11:56:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52083074 ms) 2026-03-25 11:56:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 56, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774439787.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52080.001, raw_value=52080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 28, 902830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905338, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905365, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905419, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905447, tzinfo=datetime.timezone.utc))} (T+52083083 ms) 2026-03-25 11:56:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 55, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774439727.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52020.001, raw_value=52020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 28, 901350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904373, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904395, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904426, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 55, 30, 904439, tzinfo=datetime.timezone.utc))} (T+52083084 ms) 2026-03-25 11:57:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52143068 ms) 2026-03-25 11:57:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52143068 ms) 2026-03-25 11:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 57, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774439847.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52140.001, raw_value=52140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 28, 900917, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903843, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903874, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903907, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903928, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903938, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903951, tzinfo=datetime.timezone.utc))} (T+52143069 ms) 2026-03-25 11:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 56, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774439787.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52080.001, raw_value=52080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 28, 902830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905338, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905365, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905419, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905447, tzinfo=datetime.timezone.utc))} (T+52143070 ms) 2026-03-25 11:57:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52143071 ms) 2026-03-25 11:57:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52143071 ms) 2026-03-25 11:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 57, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774439847.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52140.001, raw_value=52140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 28, 900917, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903843, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903874, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903907, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903928, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903938, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903951, tzinfo=datetime.timezone.utc))} (T+52143071 ms) 2026-03-25 11:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 56, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774439787.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52080.001, raw_value=52080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 28, 902830, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905338, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905365, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905419, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 56, 30, 905447, tzinfo=datetime.timezone.utc))} (T+52143072 ms) 2026-03-25 11:58:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52203067 ms) 2026-03-25 11:58:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52203068 ms) 2026-03-25 11:58:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 58, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774439907.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52200.001, raw_value=52200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 28, 900341, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903249, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903277, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903291, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903303, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903313, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903323, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903334, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903357, tzinfo=datetime.timezone.utc))} (T+52203068 ms) 2026-03-25 11:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 57, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774439847.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52140.001, raw_value=52140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 28, 900917, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903843, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903874, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903907, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903928, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903938, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903951, tzinfo=datetime.timezone.utc))} (T+52203069 ms) 2026-03-25 11:58:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52203070 ms) 2026-03-25 11:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52203070 ms) 2026-03-25 11:58:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 58, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774439907.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52200.001, raw_value=52200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 28, 900341, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903249, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903277, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903291, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903303, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903313, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903323, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903334, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903357, tzinfo=datetime.timezone.utc))} (T+52203071 ms) 2026-03-25 11:58:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 57, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774439847.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52140.001, raw_value=52140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 28, 900917, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903843, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903874, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903907, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903917, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903928, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903938, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 57, 30, 903951, tzinfo=datetime.timezone.utc))} (T+52203071 ms) 2026-03-25 11:59:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52263069 ms) 2026-03-25 11:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52263069 ms) 2026-03-25 11:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 59, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774439967.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52260.001, raw_value=52260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 28, 902003, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905110, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905137, tzinfo=datetime.timezone.utc))} (T+52263070 ms) 2026-03-25 11:59:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 58, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774439907.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52200.001, raw_value=52200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 28, 900341, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903249, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903277, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903291, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903303, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903313, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903323, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903334, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903357, tzinfo=datetime.timezone.utc))} (T+52263071 ms) 2026-03-25 11:59:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52263071 ms) 2026-03-25 11:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52263071 ms) 2026-03-25 11:59:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 59, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774439967.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52260.001, raw_value=52260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 28, 902003, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905110, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905137, tzinfo=datetime.timezone.utc))} (T+52263072 ms) 2026-03-25 11:59:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 58, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774439907.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52200.001, raw_value=52200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 27, 878518, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 28, 900341, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903249, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903277, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903291, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903303, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903313, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903323, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903334, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 58, 30, 903357, tzinfo=datetime.timezone.utc))} (T+52263073 ms) 2026-03-25 12:00:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52323068 ms) 2026-03-25 12:00:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52323068 ms) 2026-03-25 12:00:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 0, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774440027.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52320.001, raw_value=52320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903630, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903680, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903704, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903717, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903742, tzinfo=datetime.timezone.utc))} (T+52323069 ms) 2026-03-25 12:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 59, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774439967.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52260.001, raw_value=52260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 28, 902003, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905110, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905137, tzinfo=datetime.timezone.utc))} (T+52323070 ms) 2026-03-25 12:00:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52323071 ms) 2026-03-25 12:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52323071 ms) 2026-03-25 12:00:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 0, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774440027.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52320.001, raw_value=52320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903630, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903680, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903704, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903717, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903742, tzinfo=datetime.timezone.utc))} (T+52323071 ms) 2026-03-25 12:00:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 11, 59, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774439967.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52260.001, raw_value=52260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 28, 902003, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905110, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905121, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 11, 59, 30, 905137, tzinfo=datetime.timezone.utc))} (T+52323072 ms) 2026-03-25 12:01:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52383068 ms) 2026-03-25 12:01:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52383068 ms) 2026-03-25 12:01:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 1, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774440087.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52380.001, raw_value=52380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903768, tzinfo=datetime.timezone.utc))} (T+52383069 ms) 2026-03-25 12:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 0, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774440027.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52320.001, raw_value=52320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903630, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903680, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903704, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903717, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903742, tzinfo=datetime.timezone.utc))} (T+52383070 ms) 2026-03-25 12:01:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52383070 ms) 2026-03-25 12:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52383071 ms) 2026-03-25 12:01:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 1, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774440087.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52380.001, raw_value=52380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903768, tzinfo=datetime.timezone.utc))} (T+52383075 ms) 2026-03-25 12:01:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 0, 27, 878204, tzinfo=datetime.timezone.utc), raw_value=1774440027.878204, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878320, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52320.001, raw_value=52320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903630, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903680, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903704, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903717, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903726, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 0, 30, 903742, tzinfo=datetime.timezone.utc))} (T+52383076 ms) 2026-03-25 12:02:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52443068 ms) 2026-03-25 12:02:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52443068 ms) 2026-03-25 12:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 2, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774440147.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52440.001, raw_value=52440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 28, 900689, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903702, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903746, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903757, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903767, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903777, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903811, tzinfo=datetime.timezone.utc))} (T+52443069 ms) 2026-03-25 12:02:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 1, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774440087.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52380.001, raw_value=52380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903768, tzinfo=datetime.timezone.utc))} (T+52443070 ms) 2026-03-25 12:02:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52443071 ms) 2026-03-25 12:02:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52443071 ms) 2026-03-25 12:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 2, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774440147.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52440.001, raw_value=52440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 28, 900689, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903702, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903746, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903757, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903767, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903777, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903811, tzinfo=datetime.timezone.utc))} (T+52443072 ms) 2026-03-25 12:02:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 1, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774440087.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52380.001, raw_value=52380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 28, 900669, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903730, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 1, 30, 903768, tzinfo=datetime.timezone.utc))} (T+52443072 ms) 2026-03-25 12:03:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52503067 ms) 2026-03-25 12:03:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52503068 ms) 2026-03-25 12:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 3, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774440207.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52500.001, raw_value=52500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 28, 900586, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903599, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903626, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903657, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903667, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903678, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903703, tzinfo=datetime.timezone.utc))} (T+52503069 ms) 2026-03-25 12:03:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 2, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774440147.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52440.001, raw_value=52440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 28, 900689, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903702, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903746, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903757, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903767, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903777, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903811, tzinfo=datetime.timezone.utc))} (T+52503070 ms) 2026-03-25 12:03:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52503070 ms) 2026-03-25 12:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52503070 ms) 2026-03-25 12:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 3, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774440207.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52500.001, raw_value=52500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 28, 900586, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903599, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903626, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903657, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903667, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903678, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903703, tzinfo=datetime.timezone.utc))} (T+52503071 ms) 2026-03-25 12:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 2, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774440147.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52440.001, raw_value=52440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 28, 900689, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903702, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903731, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903746, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903757, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903767, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903777, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903789, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903799, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 2, 30, 903811, tzinfo=datetime.timezone.utc))} (T+52503072 ms) 2026-03-25 12:04:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52563067 ms) 2026-03-25 12:04:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52563068 ms) 2026-03-25 12:04:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 4, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774440267.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52560.001, raw_value=52560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 28, 900381, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903517, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903532, tzinfo=datetime.timezone.utc))} (T+52563069 ms) 2026-03-25 12:04:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 3, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774440207.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52500.001, raw_value=52500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 28, 900586, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903599, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903626, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903657, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903667, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903678, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903703, tzinfo=datetime.timezone.utc))} (T+52563070 ms) 2026-03-25 12:04:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52563070 ms) 2026-03-25 12:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52563070 ms) 2026-03-25 12:04:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 4, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774440267.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52560.001, raw_value=52560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 28, 900381, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903517, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903532, tzinfo=datetime.timezone.utc))} (T+52563076 ms) 2026-03-25 12:04:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 3, 27, 878200, tzinfo=datetime.timezone.utc), raw_value=1774440207.8782, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52500.001, raw_value=52500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 28, 900586, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903599, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903626, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903637, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903647, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903657, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903667, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903678, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903688, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 3, 30, 903703, tzinfo=datetime.timezone.utc))} (T+52563077 ms) 2026-03-25 12:05:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52623068 ms) 2026-03-25 12:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52623069 ms) 2026-03-25 12:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 5, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774440327.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52620.001, raw_value=52620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 28, 901512, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904524, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904534, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904549, tzinfo=datetime.timezone.utc))} (T+52623070 ms) 2026-03-25 12:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 4, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774440267.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52560.001, raw_value=52560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 28, 900381, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903517, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903532, tzinfo=datetime.timezone.utc))} (T+52623070 ms) 2026-03-25 12:05:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52623071 ms) 2026-03-25 12:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52623071 ms) 2026-03-25 12:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 5, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774440327.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52620.001, raw_value=52620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 28, 901512, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904524, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904534, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904549, tzinfo=datetime.timezone.utc))} (T+52623072 ms) 2026-03-25 12:05:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 4, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774440267.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52560.001, raw_value=52560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 28, 900381, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903517, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 4, 30, 903532, tzinfo=datetime.timezone.utc))} (T+52623072 ms) 2026-03-25 12:06:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52683068 ms) 2026-03-25 12:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52683068 ms) 2026-03-25 12:06:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 6, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774440387.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52680.001, raw_value=52680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 28, 900828, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903875, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903919, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903941, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903951, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903972, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903985, tzinfo=datetime.timezone.utc))} (T+52683071 ms) 2026-03-25 12:06:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 5, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774440327.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52620.001, raw_value=52620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 28, 901512, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904524, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904534, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904549, tzinfo=datetime.timezone.utc))} (T+52683072 ms) 2026-03-25 12:06:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52683073 ms) 2026-03-25 12:06:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52683073 ms) 2026-03-25 12:06:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 6, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774440387.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52680.001, raw_value=52680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 28, 900828, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903875, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903919, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903941, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903951, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903972, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903985, tzinfo=datetime.timezone.utc))} (T+52683081 ms) 2026-03-25 12:06:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 5, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774440327.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52620.001, raw_value=52620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 28, 901512, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904512, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904524, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904534, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 5, 30, 904549, tzinfo=datetime.timezone.utc))} (T+52683082 ms) 2026-03-25 12:07:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52743069 ms) 2026-03-25 12:07:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52743070 ms) 2026-03-25 12:07:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 7, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774440447.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52740.001, raw_value=52740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 28, 900994, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903967, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904029, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904049, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904072, tzinfo=datetime.timezone.utc))} (T+52743073 ms) 2026-03-25 12:07:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 6, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774440387.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52680.001, raw_value=52680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 28, 900828, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903875, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903919, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903941, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903951, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903972, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903985, tzinfo=datetime.timezone.utc))} (T+52743074 ms) 2026-03-25 12:07:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52743075 ms) 2026-03-25 12:07:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52743075 ms) 2026-03-25 12:07:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 7, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774440447.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52740.001, raw_value=52740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 28, 900994, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903967, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904029, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904049, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904072, tzinfo=datetime.timezone.utc))} (T+52743083 ms) 2026-03-25 12:07:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 6, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774440387.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878305, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52680.001, raw_value=52680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 28, 900828, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903875, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903904, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903919, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903930, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903941, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903951, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903962, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903972, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 6, 30, 903985, tzinfo=datetime.timezone.utc))} (T+52743083 ms) 2026-03-25 12:08:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52803068 ms) 2026-03-25 12:08:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52803068 ms) 2026-03-25 12:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 8, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774440507.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52800.001, raw_value=52800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903723, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903764, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903831, tzinfo=datetime.timezone.utc))} (T+52803069 ms) 2026-03-25 12:08:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 7, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774440447.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52740.001, raw_value=52740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 28, 900994, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903967, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904029, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904049, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904072, tzinfo=datetime.timezone.utc))} (T+52803070 ms) 2026-03-25 12:08:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52803070 ms) 2026-03-25 12:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52803070 ms) 2026-03-25 12:08:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 8, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774440507.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52800.001, raw_value=52800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903723, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903764, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903831, tzinfo=datetime.timezone.utc))} (T+52803078 ms) 2026-03-25 12:08:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 7, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774440447.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52740.001, raw_value=52740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 28, 900994, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903967, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904029, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904049, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 7, 30, 904072, tzinfo=datetime.timezone.utc))} (T+52803078 ms) 2026-03-25 12:09:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52863068 ms) 2026-03-25 12:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52863069 ms) 2026-03-25 12:09:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 9, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440567.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52860.001, raw_value=52860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 28, 901006, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904050, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904078, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904090, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904110, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904119, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904131, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904141, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904154, tzinfo=datetime.timezone.utc))} (T+52863070 ms) 2026-03-25 12:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 8, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774440507.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52800.001, raw_value=52800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903723, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903764, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903831, tzinfo=datetime.timezone.utc))} (T+52863071 ms) 2026-03-25 12:09:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52863071 ms) 2026-03-25 12:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52863072 ms) 2026-03-25 12:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 9, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440567.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52860.001, raw_value=52860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 28, 901006, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904050, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904078, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904090, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904110, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904119, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904131, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904141, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904154, tzinfo=datetime.timezone.utc))} (T+52863072 ms) 2026-03-25 12:09:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 8, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774440507.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52800.001, raw_value=52800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 28, 900713, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903723, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903764, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903805, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 8, 30, 903831, tzinfo=datetime.timezone.utc))} (T+52863073 ms) 2026-03-25 12:10:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52923067 ms) 2026-03-25 12:10:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52923068 ms) 2026-03-25 12:10:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 10, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774440627.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52920.001, raw_value=52920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 28, 900712, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903722, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903743, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903774, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903790, tzinfo=datetime.timezone.utc))} (T+52923069 ms) 2026-03-25 12:10:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 9, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440567.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52860.001, raw_value=52860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 28, 901006, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904050, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904078, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904090, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904110, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904119, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904131, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904141, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904154, tzinfo=datetime.timezone.utc))} (T+52923069 ms) 2026-03-25 12:10:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52923070 ms) 2026-03-25 12:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52923070 ms) 2026-03-25 12:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 10, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774440627.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52920.001, raw_value=52920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 28, 900712, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903722, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903743, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903774, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903790, tzinfo=datetime.timezone.utc))} (T+52923071 ms) 2026-03-25 12:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 9, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440567.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878289, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52860.001, raw_value=52860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 27, 878502, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 28, 901006, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904050, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904078, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904090, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904100, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904110, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904119, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904131, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904141, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 9, 30, 904154, tzinfo=datetime.timezone.utc))} (T+52923071 ms) 2026-03-25 12:11:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+52983068 ms) 2026-03-25 12:11:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+52983068 ms) 2026-03-25 12:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 11, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774440687.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52980.001, raw_value=52980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 28, 901111, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904110, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904121, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904131, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904186, tzinfo=datetime.timezone.utc))} (T+52983069 ms) 2026-03-25 12:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 10, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774440627.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52920.001, raw_value=52920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 28, 900712, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903722, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903743, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903774, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903790, tzinfo=datetime.timezone.utc))} (T+52983070 ms) 2026-03-25 12:11:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+52983071 ms) 2026-03-25 12:11:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+52983071 ms) 2026-03-25 12:11:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 11, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774440687.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52980.001, raw_value=52980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 28, 901111, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904110, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904121, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904131, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904186, tzinfo=datetime.timezone.utc))} (T+52983072 ms) 2026-03-25 12:11:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 10, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774440627.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52920.001, raw_value=52920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 28, 900712, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903722, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903743, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903753, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903764, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903774, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 10, 30, 903790, tzinfo=datetime.timezone.utc))} (T+52983073 ms) 2026-03-25 12:12:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53043067 ms) 2026-03-25 12:12:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53043068 ms) 2026-03-25 12:12:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 12, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53040.001, raw_value=53040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 28, 900191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903196, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903206, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903231, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903242, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903255, tzinfo=datetime.timezone.utc))} (T+53043069 ms) 2026-03-25 12:12:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 11, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774440687.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52980.001, raw_value=52980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 28, 901111, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904110, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904121, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904131, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904186, tzinfo=datetime.timezone.utc))} (T+53043070 ms) 2026-03-25 12:12:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53043070 ms) 2026-03-25 12:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53043070 ms) 2026-03-25 12:12:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 12, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53040.001, raw_value=53040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 28, 900191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903196, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903206, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903231, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903242, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903255, tzinfo=datetime.timezone.utc))} (T+53043078 ms) 2026-03-25 12:12:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 11, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774440687.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=52980.001, raw_value=52980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 28, 901111, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904110, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904121, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904131, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904142, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904152, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904163, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 11, 30, 904186, tzinfo=datetime.timezone.utc))} (T+53043079 ms) 2026-03-25 12:13:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53103068 ms) 2026-03-25 12:13:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53103068 ms) 2026-03-25 12:13:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 13, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774440807.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53100.001, raw_value=53100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 28, 900740, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903752, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903763, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903832, tzinfo=datetime.timezone.utc))} (T+53103069 ms) 2026-03-25 12:13:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 12, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53040.001, raw_value=53040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 28, 900191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903196, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903206, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903231, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903242, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903255, tzinfo=datetime.timezone.utc))} (T+53103070 ms) 2026-03-25 12:13:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53103071 ms) 2026-03-25 12:13:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53103071 ms) 2026-03-25 12:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 13, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774440807.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53100.001, raw_value=53100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 28, 900740, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903752, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903763, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903832, tzinfo=datetime.timezone.utc))} (T+53103071 ms) 2026-03-25 12:13:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 12, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774440747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53040.001, raw_value=53040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 28, 900191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903196, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903206, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903231, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903242, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 12, 30, 903255, tzinfo=datetime.timezone.utc))} (T+53103072 ms) 2026-03-25 12:14:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53163068 ms) 2026-03-25 12:14:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53163068 ms) 2026-03-25 12:14:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 14, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774440867.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53160.001, raw_value=53160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 28, 900770, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903918, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903929, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903970, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903983, tzinfo=datetime.timezone.utc))} (T+53163069 ms) 2026-03-25 12:14:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 13, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774440807.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53100.001, raw_value=53100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 28, 900740, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903752, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903763, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903832, tzinfo=datetime.timezone.utc))} (T+53163070 ms) 2026-03-25 12:14:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53163071 ms) 2026-03-25 12:14:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53163071 ms) 2026-03-25 12:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 14, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774440867.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53160.001, raw_value=53160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 28, 900770, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903918, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903929, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903970, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903983, tzinfo=datetime.timezone.utc))} (T+53163071 ms) 2026-03-25 12:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 13, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774440807.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53100.001, raw_value=53100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 28, 900740, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903752, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903763, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903774, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903784, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903794, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903816, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 13, 30, 903832, tzinfo=datetime.timezone.utc))} (T+53163072 ms) 2026-03-25 12:15:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53223068 ms) 2026-03-25 12:15:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53223068 ms) 2026-03-25 12:15:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 15, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774440927.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53220.001, raw_value=53220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 28, 900822, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903896, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903924, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903935, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903945, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903965, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903977, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 904003, tzinfo=datetime.timezone.utc))} (T+53223070 ms) 2026-03-25 12:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 14, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774440867.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53160.001, raw_value=53160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 28, 900770, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903918, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903929, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903970, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903983, tzinfo=datetime.timezone.utc))} (T+53223071 ms) 2026-03-25 12:15:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53223072 ms) 2026-03-25 12:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53223072 ms) 2026-03-25 12:15:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 15, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774440927.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53220.001, raw_value=53220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 28, 900822, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903896, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903924, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903935, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903945, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903965, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903977, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 904003, tzinfo=datetime.timezone.utc))} (T+53223079 ms) 2026-03-25 12:15:30.918 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 14, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774440867.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53160.001, raw_value=53160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 28, 900770, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903873, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903902, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903918, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903929, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903970, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 14, 30, 903983, tzinfo=datetime.timezone.utc))} (T+53223079 ms) 2026-03-25 12:16:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53283068 ms) 2026-03-25 12:16:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53283068 ms) 2026-03-25 12:16:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 16, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774440987.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53280.001, raw_value=53280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903693, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903722, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903734, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903765, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903776, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903802, tzinfo=datetime.timezone.utc))} (T+53283069 ms) 2026-03-25 12:16:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 15, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774440927.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53220.001, raw_value=53220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 28, 900822, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903896, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903924, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903935, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903945, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903965, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903977, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 904003, tzinfo=datetime.timezone.utc))} (T+53283070 ms) 2026-03-25 12:16:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53283070 ms) 2026-03-25 12:16:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53283071 ms) 2026-03-25 12:16:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 16, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774440987.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53280.001, raw_value=53280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903693, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903722, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903734, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903765, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903776, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903802, tzinfo=datetime.timezone.utc))} (T+53283078 ms) 2026-03-25 12:16:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 15, 27, 878201, tzinfo=datetime.timezone.utc), raw_value=1774440927.878201, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53220.001, raw_value=53220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 28, 900822, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903896, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903924, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903935, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903945, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903965, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903977, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 15, 30, 904003, tzinfo=datetime.timezone.utc))} (T+53283079 ms) 2026-03-25 12:17:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53343068 ms) 2026-03-25 12:17:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53343069 ms) 2026-03-25 12:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 17, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441047.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53340.001, raw_value=53340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878566, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 28, 901331, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904373, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904396, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904408, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904434, tzinfo=datetime.timezone.utc))} (T+53343070 ms) 2026-03-25 12:17:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 16, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774440987.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53280.001, raw_value=53280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903693, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903722, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903734, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903765, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903776, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903802, tzinfo=datetime.timezone.utc))} (T+53343071 ms) 2026-03-25 12:17:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53343071 ms) 2026-03-25 12:17:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53343072 ms) 2026-03-25 12:17:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 17, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441047.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53340.001, raw_value=53340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878566, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 28, 901331, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904373, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904396, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904408, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904434, tzinfo=datetime.timezone.utc))} (T+53343073 ms) 2026-03-25 12:17:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 16, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774440987.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53280.001, raw_value=53280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 27, 878481, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903693, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903722, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903734, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903754, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903765, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903776, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903786, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 16, 30, 903802, tzinfo=datetime.timezone.utc))} (T+53343074 ms) 2026-03-25 12:18:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53403067 ms) 2026-03-25 12:18:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53403068 ms) 2026-03-25 12:18:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 18, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774441107.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53400.001, raw_value=53400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 28, 900463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903483, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903510, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903556, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903577, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903593, tzinfo=datetime.timezone.utc))} (T+53403072 ms) 2026-03-25 12:18:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 17, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441047.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53340.001, raw_value=53340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878566, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 28, 901331, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904373, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904396, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904408, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904434, tzinfo=datetime.timezone.utc))} (T+53403072 ms) 2026-03-25 12:18:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53403073 ms) 2026-03-25 12:18:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53403073 ms) 2026-03-25 12:18:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 18, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774441107.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53400.001, raw_value=53400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 28, 900463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903483, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903510, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903556, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903577, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903593, tzinfo=datetime.timezone.utc))} (T+53403083 ms) 2026-03-25 12:18:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 17, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441047.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53340.001, raw_value=53340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 27, 878566, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 28, 901331, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904324, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904373, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904383, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904396, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904408, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904418, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 17, 30, 904434, tzinfo=datetime.timezone.utc))} (T+53403083 ms) 2026-03-25 12:19:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53463068 ms) 2026-03-25 12:19:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53463068 ms) 2026-03-25 12:19:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 19, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774441167.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878238, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53460.001, raw_value=53460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 28, 900565, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903612, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903642, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903654, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903675, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903695, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903725, tzinfo=datetime.timezone.utc))} (T+53463069 ms) 2026-03-25 12:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 18, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774441107.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53400.001, raw_value=53400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 28, 900463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903483, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903510, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903556, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903577, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903593, tzinfo=datetime.timezone.utc))} (T+53463070 ms) 2026-03-25 12:19:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53463071 ms) 2026-03-25 12:19:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53463071 ms) 2026-03-25 12:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 19, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774441167.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878238, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53460.001, raw_value=53460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 28, 900565, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903612, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903642, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903654, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903675, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903695, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903725, tzinfo=datetime.timezone.utc))} (T+53463071 ms) 2026-03-25 12:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 18, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774441107.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53400.001, raw_value=53400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 28, 900463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903483, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903510, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903524, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903535, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903556, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903577, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 18, 30, 903593, tzinfo=datetime.timezone.utc))} (T+53463072 ms) 2026-03-25 12:20:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53523068 ms) 2026-03-25 12:20:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53523068 ms) 2026-03-25 12:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 20, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441227.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53520.001, raw_value=53520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878571, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904046, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904058, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904069, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904093, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904129, tzinfo=datetime.timezone.utc))} (T+53523069 ms) 2026-03-25 12:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 19, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774441167.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878238, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53460.001, raw_value=53460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 28, 900565, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903612, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903642, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903654, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903675, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903695, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903725, tzinfo=datetime.timezone.utc))} (T+53523070 ms) 2026-03-25 12:20:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53523071 ms) 2026-03-25 12:20:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53523071 ms) 2026-03-25 12:20:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 20, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441227.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53520.001, raw_value=53520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878571, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904046, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904058, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904069, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904093, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904129, tzinfo=datetime.timezone.utc))} (T+53523071 ms) 2026-03-25 12:20:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 19, 27, 878130, tzinfo=datetime.timezone.utc), raw_value=1774441167.87813, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878238, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53460.001, raw_value=53460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 27, 878448, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 28, 900565, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903612, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903642, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903654, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903675, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903684, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903695, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903705, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 19, 30, 903725, tzinfo=datetime.timezone.utc))} (T+53523072 ms) 2026-03-25 12:21:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53583068 ms) 2026-03-25 12:21:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53583068 ms) 2026-03-25 12:21:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 21, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774441287.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53580.001, raw_value=53580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878558, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 28, 900932, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903889, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903916, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903948, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903996, tzinfo=datetime.timezone.utc))} (T+53583069 ms) 2026-03-25 12:21:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 20, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441227.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53520.001, raw_value=53520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878571, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904046, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904058, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904069, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904093, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904129, tzinfo=datetime.timezone.utc))} (T+53583070 ms) 2026-03-25 12:21:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53583071 ms) 2026-03-25 12:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53583071 ms) 2026-03-25 12:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 21, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774441287.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53580.001, raw_value=53580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878558, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 28, 900932, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903889, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903916, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903948, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903996, tzinfo=datetime.timezone.utc))} (T+53583072 ms) 2026-03-25 12:21:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 20, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774441227.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878336, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53520.001, raw_value=53520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 27, 878571, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904015, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904046, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904058, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904069, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904093, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904116, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 20, 30, 904129, tzinfo=datetime.timezone.utc))} (T+53583072 ms) 2026-03-25 12:22:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53643068 ms) 2026-03-25 12:22:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53643068 ms) 2026-03-25 12:22:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 22, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774441347.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53640.001, raw_value=53640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 28, 900709, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903794, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903861, tzinfo=datetime.timezone.utc))} (T+53643069 ms) 2026-03-25 12:22:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 21, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774441287.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53580.001, raw_value=53580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878558, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 28, 900932, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903889, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903916, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903948, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903996, tzinfo=datetime.timezone.utc))} (T+53643070 ms) 2026-03-25 12:22:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53643071 ms) 2026-03-25 12:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53643071 ms) 2026-03-25 12:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 22, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774441347.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53640.001, raw_value=53640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 28, 900709, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903794, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903861, tzinfo=datetime.timezone.utc))} (T+53643072 ms) 2026-03-25 12:22:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 21, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774441287.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53580.001, raw_value=53580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 27, 878558, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 28, 900932, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903889, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903916, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903927, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903938, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903948, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903969, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 21, 30, 903996, tzinfo=datetime.timezone.utc))} (T+53643072 ms) 2026-03-25 12:23:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53703067 ms) 2026-03-25 12:23:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53703068 ms) 2026-03-25 12:23:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 23, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774441407.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53700.001, raw_value=53700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878578, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 28, 900508, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903513, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903541, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903583, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903607, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903623, tzinfo=datetime.timezone.utc))} (T+53703069 ms) 2026-03-25 12:23:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 22, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774441347.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53640.001, raw_value=53640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 28, 900709, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903794, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903861, tzinfo=datetime.timezone.utc))} (T+53703069 ms) 2026-03-25 12:23:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53703070 ms) 2026-03-25 12:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53703071 ms) 2026-03-25 12:23:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 23, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774441407.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53700.001, raw_value=53700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878578, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 28, 900508, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903513, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903541, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903583, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903607, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903623, tzinfo=datetime.timezone.utc))} (T+53703071 ms) 2026-03-25 12:23:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 22, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774441347.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53640.001, raw_value=53640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 28, 900709, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903794, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903805, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903815, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903836, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 22, 30, 903861, tzinfo=datetime.timezone.utc))} (T+53703072 ms) 2026-03-25 12:24:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53763068 ms) 2026-03-25 12:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53763069 ms) 2026-03-25 12:24:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 24, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774441467.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53760.001, raw_value=53760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 28, 901294, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904289, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904311, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904321, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904331, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904365, tzinfo=datetime.timezone.utc))} (T+53763069 ms) 2026-03-25 12:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 23, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774441407.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53700.001, raw_value=53700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878578, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 28, 900508, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903513, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903541, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903583, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903607, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903623, tzinfo=datetime.timezone.utc))} (T+53763070 ms) 2026-03-25 12:24:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53763071 ms) 2026-03-25 12:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53763071 ms) 2026-03-25 12:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 24, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774441467.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53760.001, raw_value=53760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 28, 901294, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904289, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904311, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904321, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904331, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904365, tzinfo=datetime.timezone.utc))} (T+53763072 ms) 2026-03-25 12:24:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 23, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774441407.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53700.001, raw_value=53700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 27, 878578, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 28, 900508, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903513, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903541, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903563, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903583, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903607, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 23, 30, 903623, tzinfo=datetime.timezone.utc))} (T+53763072 ms) 2026-03-25 12:25:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53823067 ms) 2026-03-25 12:25:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53823068 ms) 2026-03-25 12:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 25, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774441527.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53820.001, raw_value=53820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 28, 900477, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903472, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903512, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903583, tzinfo=datetime.timezone.utc))} (T+53823069 ms) 2026-03-25 12:25:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 24, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774441467.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53760.001, raw_value=53760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 28, 901294, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904289, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904311, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904321, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904331, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904365, tzinfo=datetime.timezone.utc))} (T+53823070 ms) 2026-03-25 12:25:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53823071 ms) 2026-03-25 12:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53823071 ms) 2026-03-25 12:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 25, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774441527.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53820.001, raw_value=53820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 28, 900477, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903472, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903512, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903583, tzinfo=datetime.timezone.utc))} (T+53823071 ms) 2026-03-25 12:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 24, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774441467.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53760.001, raw_value=53760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 28, 901294, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904260, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904289, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904311, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904321, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904331, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904342, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904352, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 24, 30, 904365, tzinfo=datetime.timezone.utc))} (T+53823072 ms) 2026-03-25 12:26:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53883068 ms) 2026-03-25 12:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53883069 ms) 2026-03-25 12:26:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 26, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774441587.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53880.001, raw_value=53880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878596, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 28, 901405, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904400, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904427, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904454, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904464, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904474, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904485, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904495, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904508, tzinfo=datetime.timezone.utc))} (T+53883070 ms) 2026-03-25 12:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 25, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774441527.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53820.001, raw_value=53820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 28, 900477, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903472, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903512, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903583, tzinfo=datetime.timezone.utc))} (T+53883071 ms) 2026-03-25 12:26:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53883071 ms) 2026-03-25 12:26:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53883072 ms) 2026-03-25 12:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 26, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774441587.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53880.001, raw_value=53880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878596, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 28, 901405, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904400, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904427, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904454, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904464, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904474, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904485, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904495, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904508, tzinfo=datetime.timezone.utc))} (T+53883072 ms) 2026-03-25 12:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 25, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774441527.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53820.001, raw_value=53820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 28, 900477, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903472, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903512, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903523, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903533, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903546, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903567, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 25, 30, 903583, tzinfo=datetime.timezone.utc))} (T+53883073 ms) 2026-03-25 12:27:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+53943068 ms) 2026-03-25 12:27:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+53943068 ms) 2026-03-25 12:27:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 27, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774441647.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53940.001, raw_value=53940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878478, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903760, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903831, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903845, tzinfo=datetime.timezone.utc))} (T+53943069 ms) 2026-03-25 12:27:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 26, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774441587.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53880.001, raw_value=53880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878596, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 28, 901405, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904400, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904427, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904454, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904464, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904474, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904485, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904495, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904508, tzinfo=datetime.timezone.utc))} (T+53943070 ms) 2026-03-25 12:27:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+53943071 ms) 2026-03-25 12:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+53943071 ms) 2026-03-25 12:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 27, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774441647.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53940.001, raw_value=53940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878478, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903760, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903831, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903845, tzinfo=datetime.timezone.utc))} (T+53943072 ms) 2026-03-25 12:27:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 26, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774441587.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53880.001, raw_value=53880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 27, 878596, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 28, 901405, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904400, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904427, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904442, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904454, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904464, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904474, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904485, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904495, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 26, 30, 904508, tzinfo=datetime.timezone.utc))} (T+53943072 ms) 2026-03-25 12:28:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54003068 ms) 2026-03-25 12:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54003068 ms) 2026-03-25 12:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 28, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774441707.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54000.001, raw_value=54000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 28, 900908, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903891, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903913, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903934, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903976, tzinfo=datetime.timezone.utc))} (T+54003070 ms) 2026-03-25 12:28:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 27, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774441647.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53940.001, raw_value=53940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878478, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903760, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903831, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903845, tzinfo=datetime.timezone.utc))} (T+54003071 ms) 2026-03-25 12:28:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54003071 ms) 2026-03-25 12:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54003072 ms) 2026-03-25 12:28:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 28, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774441707.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54000.001, raw_value=54000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 28, 900908, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903891, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903913, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903934, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903976, tzinfo=datetime.timezone.utc))} (T+54003072 ms) 2026-03-25 12:28:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 27, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774441647.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=53940.001, raw_value=53940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 27, 878478, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 28, 900695, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903731, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903760, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903771, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903781, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903831, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 27, 30, 903845, tzinfo=datetime.timezone.utc))} (T+54003073 ms) 2026-03-25 12:29:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54063068 ms) 2026-03-25 12:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54063068 ms) 2026-03-25 12:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 29, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774441767.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54060.001, raw_value=54060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 28, 900792, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903815, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903845, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903857, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903888, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903899, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903909, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903922, tzinfo=datetime.timezone.utc))} (T+54063069 ms) 2026-03-25 12:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 28, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774441707.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54000.001, raw_value=54000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 28, 900908, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903891, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903913, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903934, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903976, tzinfo=datetime.timezone.utc))} (T+54063070 ms) 2026-03-25 12:29:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54063071 ms) 2026-03-25 12:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54063071 ms) 2026-03-25 12:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 29, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774441767.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54060.001, raw_value=54060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 28, 900792, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903815, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903845, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903857, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903888, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903899, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903909, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903922, tzinfo=datetime.timezone.utc))} (T+54063071 ms) 2026-03-25 12:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 28, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774441707.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54000.001, raw_value=54000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 28, 900908, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903862, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903891, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903903, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903913, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903923, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903934, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903949, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903960, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 28, 30, 903976, tzinfo=datetime.timezone.utc))} (T+54063072 ms) 2026-03-25 12:30:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54123068 ms) 2026-03-25 12:30:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54123069 ms) 2026-03-25 12:30:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 30, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774441827.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54120.001, raw_value=54120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 28, 901207, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904169, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904197, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904211, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904234, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904255, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904278, tzinfo=datetime.timezone.utc))} (T+54123069 ms) 2026-03-25 12:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 29, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774441767.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54060.001, raw_value=54060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 28, 900792, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903815, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903845, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903857, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903888, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903899, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903909, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903922, tzinfo=datetime.timezone.utc))} (T+54123070 ms) 2026-03-25 12:30:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54123071 ms) 2026-03-25 12:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54123071 ms) 2026-03-25 12:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 30, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774441827.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54120.001, raw_value=54120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 28, 901207, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904169, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904197, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904211, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904234, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904255, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904278, tzinfo=datetime.timezone.utc))} (T+54123072 ms) 2026-03-25 12:30:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 29, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774441767.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54060.001, raw_value=54060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 28, 900792, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903815, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903845, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903857, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903888, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903899, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903909, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 29, 30, 903922, tzinfo=datetime.timezone.utc))} (T+54123073 ms) 2026-03-25 12:31:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54183067 ms) 2026-03-25 12:31:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54183068 ms) 2026-03-25 12:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 31, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774441887.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54180.001, raw_value=54180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 28, 900363, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903370, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903398, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903409, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903443, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903484, tzinfo=datetime.timezone.utc))} (T+54183069 ms) 2026-03-25 12:31:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 30, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774441827.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54120.001, raw_value=54120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 28, 901207, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904169, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904197, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904211, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904234, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904255, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904278, tzinfo=datetime.timezone.utc))} (T+54183069 ms) 2026-03-25 12:31:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54183070 ms) 2026-03-25 12:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54183070 ms) 2026-03-25 12:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 31, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774441887.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54180.001, raw_value=54180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 28, 900363, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903370, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903398, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903409, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903443, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903484, tzinfo=datetime.timezone.utc))} (T+54183071 ms) 2026-03-25 12:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 30, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774441827.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878334, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54120.001, raw_value=54120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 27, 878549, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 28, 901207, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904169, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904197, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904211, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904234, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904255, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 30, 30, 904278, tzinfo=datetime.timezone.utc))} (T+54183072 ms) 2026-03-25 12:32:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54243070 ms) 2026-03-25 12:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54243070 ms) 2026-03-25 12:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 32, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774441947.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54240.001, raw_value=54240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 28, 901869, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904936, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904968, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904979, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904990, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905021, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905031, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905047, tzinfo=datetime.timezone.utc))} (T+54243071 ms) 2026-03-25 12:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 31, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774441887.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54180.001, raw_value=54180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 28, 900363, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903370, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903398, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903409, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903443, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903484, tzinfo=datetime.timezone.utc))} (T+54243072 ms) 2026-03-25 12:32:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54243073 ms) 2026-03-25 12:32:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54243073 ms) 2026-03-25 12:32:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 32, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774441947.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54240.001, raw_value=54240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 28, 901869, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904936, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904968, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904979, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904990, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905021, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905031, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905047, tzinfo=datetime.timezone.utc))} (T+54243074 ms) 2026-03-25 12:32:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 31, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774441887.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54180.001, raw_value=54180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 28, 900363, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903370, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903398, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903409, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903419, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903430, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903443, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 31, 30, 903484, tzinfo=datetime.timezone.utc))} (T+54243074 ms) 2026-03-25 12:33:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54303068 ms) 2026-03-25 12:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54303068 ms) 2026-03-25 12:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774442007.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54300.001, raw_value=54300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 28, 901081, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904055, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904095, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904106, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904116, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904127, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904154, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904168, tzinfo=datetime.timezone.utc))} (T+54303069 ms) 2026-03-25 12:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 32, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774441947.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54240.001, raw_value=54240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 28, 901869, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904936, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904968, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904979, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904990, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905021, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905031, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905047, tzinfo=datetime.timezone.utc))} (T+54303070 ms) 2026-03-25 12:33:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54303071 ms) 2026-03-25 12:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54303071 ms) 2026-03-25 12:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774442007.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54300.001, raw_value=54300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 28, 901081, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904055, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904095, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904106, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904116, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904127, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904154, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904168, tzinfo=datetime.timezone.utc))} (T+54303072 ms) 2026-03-25 12:33:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 32, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774441947.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878295, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54240.001, raw_value=54240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 28, 901869, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904936, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904968, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904979, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 904990, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905001, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905011, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905021, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905031, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 32, 30, 905047, tzinfo=datetime.timezone.utc))} (T+54303073 ms) 2026-03-25 12:34:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54363068 ms) 2026-03-25 12:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54363068 ms) 2026-03-25 12:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 34, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774442067.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54360.001, raw_value=54360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903737, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903782, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903847, tzinfo=datetime.timezone.utc))} (T+54363069 ms) 2026-03-25 12:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774442007.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54300.001, raw_value=54300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 28, 901081, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904055, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904095, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904106, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904116, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904127, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904154, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904168, tzinfo=datetime.timezone.utc))} (T+54363070 ms) 2026-03-25 12:34:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54363071 ms) 2026-03-25 12:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54363071 ms) 2026-03-25 12:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 34, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774442067.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54360.001, raw_value=54360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903737, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903782, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903847, tzinfo=datetime.timezone.utc))} (T+54363072 ms) 2026-03-25 12:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774442007.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54300.001, raw_value=54300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 28, 901081, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904055, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904084, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904095, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904106, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904116, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904127, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904154, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 33, 30, 904168, tzinfo=datetime.timezone.utc))} (T+54363072 ms) 2026-03-25 12:35:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54423068 ms) 2026-03-25 12:35:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54423068 ms) 2026-03-25 12:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 35, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774442127.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54420.001, raw_value=54420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903786, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903813, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903846, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903871, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903897, tzinfo=datetime.timezone.utc))} (T+54423069 ms) 2026-03-25 12:35:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 34, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774442067.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54360.001, raw_value=54360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903737, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903782, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903847, tzinfo=datetime.timezone.utc))} (T+54423070 ms) 2026-03-25 12:35:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54423071 ms) 2026-03-25 12:35:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54423071 ms) 2026-03-25 12:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 35, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774442127.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54420.001, raw_value=54420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903786, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903813, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903846, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903871, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903897, tzinfo=datetime.timezone.utc))} (T+54423071 ms) 2026-03-25 12:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 34, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774442067.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54360.001, raw_value=54360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903737, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903766, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903782, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903793, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903834, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 34, 30, 903847, tzinfo=datetime.timezone.utc))} (T+54423072 ms) 2026-03-25 12:36:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54483068 ms) 2026-03-25 12:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54483069 ms) 2026-03-25 12:36:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 36, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774442187.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54480.001, raw_value=54480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 28, 901538, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904530, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904541, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904552, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904562, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904572, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904584, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904594, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904607, tzinfo=datetime.timezone.utc))} (T+54483070 ms) 2026-03-25 12:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 35, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774442127.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54420.001, raw_value=54420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903786, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903813, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903846, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903871, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903897, tzinfo=datetime.timezone.utc))} (T+54483071 ms) 2026-03-25 12:36:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54483071 ms) 2026-03-25 12:36:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54483072 ms) 2026-03-25 12:36:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 36, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774442187.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54480.001, raw_value=54480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 28, 901538, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904530, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904541, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904552, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904562, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904572, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904584, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904594, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904607, tzinfo=datetime.timezone.utc))} (T+54483072 ms) 2026-03-25 12:36:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 35, 27, 878145, tzinfo=datetime.timezone.utc), raw_value=1774442127.878145, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878253, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54420.001, raw_value=54420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 27, 878464, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 28, 900759, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903786, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903813, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903846, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903871, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903881, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 35, 30, 903897, tzinfo=datetime.timezone.utc))} (T+54483073 ms) 2026-03-25 12:37:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54543068 ms) 2026-03-25 12:37:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54543068 ms) 2026-03-25 12:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 37, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774442247.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54540.001, raw_value=54540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 28, 900551, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903759, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903795, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903806, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903828, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903855, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903866, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903883, tzinfo=datetime.timezone.utc))} (T+54543069 ms) 2026-03-25 12:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 36, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774442187.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54480.001, raw_value=54480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 28, 901538, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904530, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904541, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904552, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904562, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904572, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904584, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904594, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904607, tzinfo=datetime.timezone.utc))} (T+54543070 ms) 2026-03-25 12:37:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54543071 ms) 2026-03-25 12:37:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54543071 ms) 2026-03-25 12:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 37, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774442247.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54540.001, raw_value=54540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 28, 900551, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903759, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903795, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903806, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903828, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903855, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903866, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903883, tzinfo=datetime.timezone.utc))} (T+54543072 ms) 2026-03-25 12:37:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 36, 27, 878223, tzinfo=datetime.timezone.utc), raw_value=1774442187.878223, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878340, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54480.001, raw_value=54480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 28, 901538, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904530, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904541, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904552, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904562, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904572, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904584, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904594, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 36, 30, 904607, tzinfo=datetime.timezone.utc))} (T+54543072 ms) 2026-03-25 12:38:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54603069 ms) 2026-03-25 12:38:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54603070 ms) 2026-03-25 12:38:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 38, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774442307.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54600.001, raw_value=54600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 28, 902557, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905535, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905589, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905599, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905609, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905620, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905646, tzinfo=datetime.timezone.utc))} (T+54603073 ms) 2026-03-25 12:38:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 37, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774442247.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54540.001, raw_value=54540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 28, 900551, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903759, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903795, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903806, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903828, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903855, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903866, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903883, tzinfo=datetime.timezone.utc))} (T+54603074 ms) 2026-03-25 12:38:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54603075 ms) 2026-03-25 12:38:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54603075 ms) 2026-03-25 12:38:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 38, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774442307.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54600.001, raw_value=54600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 28, 902557, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905535, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905589, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905599, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905609, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905620, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905646, tzinfo=datetime.timezone.utc))} (T+54603083 ms) 2026-03-25 12:38:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 37, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774442247.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54540.001, raw_value=54540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 28, 900551, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903759, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903795, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903806, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903828, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903838, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903855, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903866, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 37, 30, 903883, tzinfo=datetime.timezone.utc))} (T+54603084 ms) 2026-03-25 12:39:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54663067 ms) 2026-03-25 12:39:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54663068 ms) 2026-03-25 12:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 39, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442367.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878265, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54660.001, raw_value=54660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 28, 900491, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903565, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903576, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903643, tzinfo=datetime.timezone.utc))} (T+54663069 ms) 2026-03-25 12:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 38, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774442307.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54600.001, raw_value=54600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 28, 902557, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905535, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905589, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905599, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905609, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905620, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905646, tzinfo=datetime.timezone.utc))} (T+54663070 ms) 2026-03-25 12:39:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54663071 ms) 2026-03-25 12:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54663071 ms) 2026-03-25 12:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 39, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442367.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878265, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54660.001, raw_value=54660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 28, 900491, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903565, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903576, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903643, tzinfo=datetime.timezone.utc))} (T+54663071 ms) 2026-03-25 12:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 38, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774442307.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54600.001, raw_value=54600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 28, 902557, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905535, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905589, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905599, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905609, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905620, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 38, 30, 905646, tzinfo=datetime.timezone.utc))} (T+54663072 ms) 2026-03-25 12:40:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54723068 ms) 2026-03-25 12:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54723068 ms) 2026-03-25 12:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 40, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774442427.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54720.001, raw_value=54720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 28, 900957, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903904, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903943, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903953, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903964, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903985, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903995, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 904010, tzinfo=datetime.timezone.utc))} (T+54723069 ms) 2026-03-25 12:40:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 39, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442367.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878265, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54660.001, raw_value=54660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 28, 900491, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903565, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903576, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903643, tzinfo=datetime.timezone.utc))} (T+54723070 ms) 2026-03-25 12:40:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54723071 ms) 2026-03-25 12:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54723071 ms) 2026-03-25 12:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 40, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774442427.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54720.001, raw_value=54720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 28, 900957, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903904, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903943, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903953, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903964, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903985, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903995, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 904010, tzinfo=datetime.timezone.utc))} (T+54723071 ms) 2026-03-25 12:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 39, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442367.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878265, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54660.001, raw_value=54660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 28, 900491, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903537, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903565, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903576, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903607, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 39, 30, 903643, tzinfo=datetime.timezone.utc))} (T+54723072 ms) 2026-03-25 12:41:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54783068 ms) 2026-03-25 12:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54783068 ms) 2026-03-25 12:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 41, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774442487.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54780.001, raw_value=54780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903924, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903953, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903964, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903985, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903994, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904005, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904015, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904029, tzinfo=datetime.timezone.utc))} (T+54783069 ms) 2026-03-25 12:41:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 40, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774442427.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54720.001, raw_value=54720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 28, 900957, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903904, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903943, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903953, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903964, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903985, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903995, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 904010, tzinfo=datetime.timezone.utc))} (T+54783070 ms) 2026-03-25 12:41:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54783071 ms) 2026-03-25 12:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54783071 ms) 2026-03-25 12:41:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 41, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774442487.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54780.001, raw_value=54780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903924, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903953, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903964, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903985, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903994, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904005, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904015, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904029, tzinfo=datetime.timezone.utc))} (T+54783072 ms) 2026-03-25 12:41:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 40, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774442427.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54720.001, raw_value=54720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 28, 900957, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903904, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903943, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903953, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903964, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903973, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903985, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 903995, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 40, 30, 904010, tzinfo=datetime.timezone.utc))} (T+54783072 ms) 2026-03-25 12:42:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54843067 ms) 2026-03-25 12:42:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54843068 ms) 2026-03-25 12:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 42, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774442547.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54840.001, raw_value=54840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 28, 900554, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903543, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903584, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903595, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903641, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903658, tzinfo=datetime.timezone.utc))} (T+54843068 ms) 2026-03-25 12:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 41, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774442487.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54780.001, raw_value=54780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903924, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903953, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903964, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903985, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903994, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904005, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904015, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904029, tzinfo=datetime.timezone.utc))} (T+54843069 ms) 2026-03-25 12:42:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54843070 ms) 2026-03-25 12:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54843070 ms) 2026-03-25 12:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 42, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774442547.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54840.001, raw_value=54840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 28, 900554, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903543, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903584, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903595, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903641, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903658, tzinfo=datetime.timezone.utc))} (T+54843070 ms) 2026-03-25 12:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 41, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774442487.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54780.001, raw_value=54780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 27, 878466, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 28, 900940, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903924, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903953, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903964, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903974, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903985, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 903994, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904005, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904015, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 41, 30, 904029, tzinfo=datetime.timezone.utc))} (T+54843071 ms) 2026-03-25 12:43:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54903068 ms) 2026-03-25 12:43:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54903068 ms) 2026-03-25 12:43:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 43, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442607.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54900.001, raw_value=54900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903893, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903906, tzinfo=datetime.timezone.utc))} (T+54903069 ms) 2026-03-25 12:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 42, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774442547.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54840.001, raw_value=54840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 28, 900554, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903543, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903584, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903595, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903641, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903658, tzinfo=datetime.timezone.utc))} (T+54903070 ms) 2026-03-25 12:43:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54903070 ms) 2026-03-25 12:43:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54903070 ms) 2026-03-25 12:43:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 43, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442607.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54900.001, raw_value=54900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903893, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903906, tzinfo=datetime.timezone.utc))} (T+54903075 ms) 2026-03-25 12:43:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 42, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774442547.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54840.001, raw_value=54840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 28, 900554, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903543, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903570, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903584, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903595, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903641, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 42, 30, 903658, tzinfo=datetime.timezone.utc))} (T+54903075 ms) 2026-03-25 12:44:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+54963068 ms) 2026-03-25 12:44:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+54963069 ms) 2026-03-25 12:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 44, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774442667.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54960.001, raw_value=54960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 28, 901457, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904425, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904453, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904475, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904485, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904530, tzinfo=datetime.timezone.utc))} (T+54963070 ms) 2026-03-25 12:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 43, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442607.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54900.001, raw_value=54900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903893, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903906, tzinfo=datetime.timezone.utc))} (T+54963071 ms) 2026-03-25 12:44:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+54963072 ms) 2026-03-25 12:44:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+54963072 ms) 2026-03-25 12:44:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 44, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774442667.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54960.001, raw_value=54960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 28, 901457, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904425, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904453, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904475, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904485, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904530, tzinfo=datetime.timezone.utc))} (T+54963073 ms) 2026-03-25 12:44:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 43, 27, 878150, tzinfo=datetime.timezone.utc), raw_value=1774442607.87815, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54900.001, raw_value=54900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903801, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903830, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903872, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903893, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 43, 30, 903906, tzinfo=datetime.timezone.utc))} (T+54963073 ms) 2026-03-25 12:45:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55023068 ms) 2026-03-25 12:45:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55023068 ms) 2026-03-25 12:45:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 45, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774442727.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55020.001, raw_value=55020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 28, 900704, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903765, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903785, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903837, tzinfo=datetime.timezone.utc))} (T+55023069 ms) 2026-03-25 12:45:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 44, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774442667.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54960.001, raw_value=54960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 28, 901457, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904425, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904453, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904475, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904485, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904530, tzinfo=datetime.timezone.utc))} (T+55023070 ms) 2026-03-25 12:45:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55023070 ms) 2026-03-25 12:45:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55023070 ms) 2026-03-25 12:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 45, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774442727.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55020.001, raw_value=55020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 28, 900704, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903765, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903785, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903837, tzinfo=datetime.timezone.utc))} (T+55023071 ms) 2026-03-25 12:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 44, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774442667.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=54960.001, raw_value=54960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 27, 878533, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 28, 901457, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904425, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904453, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904465, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904475, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904485, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904496, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904506, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904516, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 44, 30, 904530, tzinfo=datetime.timezone.utc))} (T+55023072 ms) 2026-03-25 12:46:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55083068 ms) 2026-03-25 12:46:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55083069 ms) 2026-03-25 12:46:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 46, 27, 878185, tzinfo=datetime.timezone.utc), raw_value=1774442787.878185, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55080.001, raw_value=55080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 28, 901343, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904429, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904449, tzinfo=datetime.timezone.utc))} (T+55083070 ms) 2026-03-25 12:46:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 45, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774442727.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55020.001, raw_value=55020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 28, 900704, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903765, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903785, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903837, tzinfo=datetime.timezone.utc))} (T+55083070 ms) 2026-03-25 12:46:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55083071 ms) 2026-03-25 12:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55083071 ms) 2026-03-25 12:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 46, 27, 878185, tzinfo=datetime.timezone.utc), raw_value=1774442787.878185, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55080.001, raw_value=55080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 28, 901343, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904429, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904449, tzinfo=datetime.timezone.utc))} (T+55083072 ms) 2026-03-25 12:46:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 45, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774442727.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55020.001, raw_value=55020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 28, 900704, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903724, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903753, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903765, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903775, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903785, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903795, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903806, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 45, 30, 903837, tzinfo=datetime.timezone.utc))} (T+55083073 ms) 2026-03-25 12:47:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55143067 ms) 2026-03-25 12:47:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55143067 ms) 2026-03-25 12:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 47, 27, 878079, tzinfo=datetime.timezone.utc), raw_value=1774442847.878079, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878185, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55140.001, raw_value=55140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878395, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 28, 900058, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903000, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903065, tzinfo=datetime.timezone.utc))} (T+55143068 ms) 2026-03-25 12:47:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 46, 27, 878185, tzinfo=datetime.timezone.utc), raw_value=1774442787.878185, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55080.001, raw_value=55080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 28, 901343, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904429, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904449, tzinfo=datetime.timezone.utc))} (T+55143069 ms) 2026-03-25 12:47:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55143070 ms) 2026-03-25 12:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55143070 ms) 2026-03-25 12:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 47, 27, 878079, tzinfo=datetime.timezone.utc), raw_value=1774442847.878079, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878185, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55140.001, raw_value=55140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878395, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 28, 900058, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903000, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903065, tzinfo=datetime.timezone.utc))} (T+55143071 ms) 2026-03-25 12:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 46, 27, 878185, tzinfo=datetime.timezone.utc), raw_value=1774442787.878185, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55080.001, raw_value=55080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 28, 901343, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904334, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904377, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904399, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904420, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904429, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 46, 30, 904449, tzinfo=datetime.timezone.utc))} (T+55143071 ms) 2026-03-25 12:48:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55203067 ms) 2026-03-25 12:48:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55203067 ms) 2026-03-25 12:48:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 48, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774442907.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55200.001, raw_value=55200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 28, 900054, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 902994, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903023, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903034, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903044, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903055, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903065, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903087, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903100, tzinfo=datetime.timezone.utc))} (T+55203068 ms) 2026-03-25 12:48:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 47, 27, 878079, tzinfo=datetime.timezone.utc), raw_value=1774442847.878079, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878185, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55140.001, raw_value=55140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878395, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 28, 900058, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903000, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903065, tzinfo=datetime.timezone.utc))} (T+55203069 ms) 2026-03-25 12:48:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55203070 ms) 2026-03-25 12:48:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55203070 ms) 2026-03-25 12:48:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 48, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774442907.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55200.001, raw_value=55200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 28, 900054, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 902994, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903023, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903034, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903044, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903055, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903065, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903087, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903100, tzinfo=datetime.timezone.utc))} (T+55203071 ms) 2026-03-25 12:48:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 47, 27, 878079, tzinfo=datetime.timezone.utc), raw_value=1774442847.878079, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878185, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55140.001, raw_value=55140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 27, 878395, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 28, 900058, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 902988, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903000, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903011, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903031, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903042, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903052, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 47, 30, 903065, tzinfo=datetime.timezone.utc))} (T+55203072 ms) 2026-03-25 12:49:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55263068 ms) 2026-03-25 12:49:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55263069 ms) 2026-03-25 12:49:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774442967.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55260.001, raw_value=55260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 28, 900678, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904062, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904073, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904091, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904103, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904120, tzinfo=datetime.timezone.utc))} (T+55263070 ms) 2026-03-25 12:49:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 48, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774442907.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55200.001, raw_value=55200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 28, 900054, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 902994, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903023, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903034, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903044, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903055, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903065, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903087, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903100, tzinfo=datetime.timezone.utc))} (T+55263070 ms) 2026-03-25 12:49:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55263071 ms) 2026-03-25 12:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55263071 ms) 2026-03-25 12:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774442967.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55260.001, raw_value=55260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 28, 900678, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904062, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904073, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904091, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904103, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904120, tzinfo=datetime.timezone.utc))} (T+55263072 ms) 2026-03-25 12:49:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 48, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774442907.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55200.001, raw_value=55200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 28, 900054, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 902994, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903023, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903034, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903044, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903055, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903065, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903087, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 48, 30, 903100, tzinfo=datetime.timezone.utc))} (T+55263073 ms) 2026-03-25 12:50:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55323067 ms) 2026-03-25 12:50:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55323067 ms) 2026-03-25 12:50:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 50, 27, 878108, tzinfo=datetime.timezone.utc), raw_value=1774443027.878108, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878224, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55320.001, raw_value=55320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 28, 900214, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903129, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903156, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903171, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903181, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903192, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903201, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903212, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903222, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903238, tzinfo=datetime.timezone.utc))} (T+55323068 ms) 2026-03-25 12:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774442967.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55260.001, raw_value=55260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 28, 900678, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904062, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904073, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904091, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904103, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904120, tzinfo=datetime.timezone.utc))} (T+55323069 ms) 2026-03-25 12:50:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55323069 ms) 2026-03-25 12:50:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55323070 ms) 2026-03-25 12:50:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 50, 27, 878108, tzinfo=datetime.timezone.utc), raw_value=1774443027.878108, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878224, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55320.001, raw_value=55320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 28, 900214, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903129, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903156, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903171, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903181, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903192, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903201, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903212, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903222, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903238, tzinfo=datetime.timezone.utc))} (T+55323070 ms) 2026-03-25 12:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 49, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774442967.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55260.001, raw_value=55260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 28, 900678, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904029, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904041, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904052, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904062, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904073, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904091, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904103, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 49, 30, 904120, tzinfo=datetime.timezone.utc))} (T+55323071 ms) 2026-03-25 12:51:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55383067 ms) 2026-03-25 12:51:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55383067 ms) 2026-03-25 12:51:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774443087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55380.001, raw_value=55380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 28, 900226, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903151, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903233, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903244, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903259, tzinfo=datetime.timezone.utc))} (T+55383069 ms) 2026-03-25 12:51:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 50, 27, 878108, tzinfo=datetime.timezone.utc), raw_value=1774443027.878108, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878224, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55320.001, raw_value=55320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 28, 900214, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903129, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903156, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903171, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903181, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903192, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903201, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903212, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903222, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903238, tzinfo=datetime.timezone.utc))} (T+55383069 ms) 2026-03-25 12:51:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55383070 ms) 2026-03-25 12:51:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55383070 ms) 2026-03-25 12:51:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774443087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55380.001, raw_value=55380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 28, 900226, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903151, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903233, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903244, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903259, tzinfo=datetime.timezone.utc))} (T+55383076 ms) 2026-03-25 12:51:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 50, 27, 878108, tzinfo=datetime.timezone.utc), raw_value=1774443027.878108, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878224, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55320.001, raw_value=55320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 28, 900214, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903129, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903156, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903171, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903181, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903192, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903201, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903212, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903222, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 50, 30, 903238, tzinfo=datetime.timezone.utc))} (T+55383077 ms) 2026-03-25 12:52:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55443068 ms) 2026-03-25 12:52:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55443068 ms) 2026-03-25 12:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 52, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774443147.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878235, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55440.001, raw_value=55440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 28, 900761, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903735, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903764, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903787, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903847, tzinfo=datetime.timezone.utc))} (T+55443069 ms) 2026-03-25 12:52:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774443087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55380.001, raw_value=55380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 28, 900226, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903151, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903233, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903244, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903259, tzinfo=datetime.timezone.utc))} (T+55443070 ms) 2026-03-25 12:52:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55443071 ms) 2026-03-25 12:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55443071 ms) 2026-03-25 12:52:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 52, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774443147.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878235, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55440.001, raw_value=55440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 28, 900761, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903735, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903764, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903787, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903847, tzinfo=datetime.timezone.utc))} (T+55443072 ms) 2026-03-25 12:52:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774443087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55380.001, raw_value=55380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 28, 900226, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903151, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903233, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903244, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 51, 30, 903259, tzinfo=datetime.timezone.utc))} (T+55443072 ms) 2026-03-25 12:53:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55503067 ms) 2026-03-25 12:53:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55503068 ms) 2026-03-25 12:53:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 53, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774443207.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55500.001, raw_value=55500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 28, 900691, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903658, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903728, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903738, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903749, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903764, tzinfo=datetime.timezone.utc))} (T+55503069 ms) 2026-03-25 12:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 52, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774443147.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878235, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55440.001, raw_value=55440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 28, 900761, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903735, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903764, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903787, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903847, tzinfo=datetime.timezone.utc))} (T+55503070 ms) 2026-03-25 12:53:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55503071 ms) 2026-03-25 12:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55503071 ms) 2026-03-25 12:53:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 53, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774443207.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55500.001, raw_value=55500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 28, 900691, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903658, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903728, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903738, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903749, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903764, tzinfo=datetime.timezone.utc))} (T+55503072 ms) 2026-03-25 12:53:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 52, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774443147.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878235, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55440.001, raw_value=55440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 27, 878443, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 28, 900761, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903735, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903764, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903777, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903787, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903798, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903808, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903819, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 52, 30, 903847, tzinfo=datetime.timezone.utc))} (T+55503072 ms) 2026-03-25 12:54:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55563069 ms) 2026-03-25 12:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55563069 ms) 2026-03-25 12:54:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 54, 27, 878238, tzinfo=datetime.timezone.utc), raw_value=1774443267.878238, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878376, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55560.001, raw_value=55560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878617, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 28, 901773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904756, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904782, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904802, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904813, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904840, tzinfo=datetime.timezone.utc))} (T+55563071 ms) 2026-03-25 12:54:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 53, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774443207.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55500.001, raw_value=55500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 28, 900691, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903658, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903728, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903738, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903749, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903764, tzinfo=datetime.timezone.utc))} (T+55563072 ms) 2026-03-25 12:54:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55563073 ms) 2026-03-25 12:54:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55563073 ms) 2026-03-25 12:54:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 54, 27, 878238, tzinfo=datetime.timezone.utc), raw_value=1774443267.878238, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878376, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55560.001, raw_value=55560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878617, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 28, 901773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904756, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904782, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904802, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904813, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904840, tzinfo=datetime.timezone.utc))} (T+55563076 ms) 2026-03-25 12:54:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 53, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774443207.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55500.001, raw_value=55500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 28, 900691, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903658, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903686, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903697, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903708, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903718, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903728, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903738, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903749, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 53, 30, 903764, tzinfo=datetime.timezone.utc))} (T+55563077 ms) 2026-03-25 12:55:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55623068 ms) 2026-03-25 12:55:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55623068 ms) 2026-03-25 12:55:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 55, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774443327.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55620.001, raw_value=55620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 28, 900733, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903853, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903888, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903900, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903910, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903921, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903931, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903944, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903970, tzinfo=datetime.timezone.utc))} (T+55623069 ms) 2026-03-25 12:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 54, 27, 878238, tzinfo=datetime.timezone.utc), raw_value=1774443267.878238, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878376, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55560.001, raw_value=55560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878617, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 28, 901773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904756, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904782, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904802, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904813, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904840, tzinfo=datetime.timezone.utc))} (T+55623072 ms) 2026-03-25 12:55:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55623073 ms) 2026-03-25 12:55:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55623073 ms) 2026-03-25 12:55:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 55, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774443327.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55620.001, raw_value=55620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 28, 900733, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903853, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903888, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903900, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903910, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903921, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903931, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903944, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903970, tzinfo=datetime.timezone.utc))} (T+55623073 ms) 2026-03-25 12:55:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 54, 27, 878238, tzinfo=datetime.timezone.utc), raw_value=1774443267.878238, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878376, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55560.001, raw_value=55560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 27, 878617, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 28, 901773, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904727, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904756, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904782, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904792, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904802, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904813, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 54, 30, 904840, tzinfo=datetime.timezone.utc))} (T+55623076 ms) 2026-03-25 12:56:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55683068 ms) 2026-03-25 12:56:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55683069 ms) 2026-03-25 12:56:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 56, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774443387.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55680.001, raw_value=55680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904076, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904106, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904118, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904189, tzinfo=datetime.timezone.utc))} (T+55683070 ms) 2026-03-25 12:56:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 55, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774443327.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55620.001, raw_value=55620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 28, 900733, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903853, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903888, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903900, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903910, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903921, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903931, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903944, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903970, tzinfo=datetime.timezone.utc))} (T+55683072 ms) 2026-03-25 12:56:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55683073 ms) 2026-03-25 12:56:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55683073 ms) 2026-03-25 12:56:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 56, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774443387.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55680.001, raw_value=55680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904076, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904106, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904118, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904189, tzinfo=datetime.timezone.utc))} (T+55683074 ms) 2026-03-25 12:56:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 55, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774443327.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55620.001, raw_value=55620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 28, 900733, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903853, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903888, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903900, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903910, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903921, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903931, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903944, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 55, 30, 903970, tzinfo=datetime.timezone.utc))} (T+55683074 ms) 2026-03-25 12:57:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55743068 ms) 2026-03-25 12:57:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55743068 ms) 2026-03-25 12:57:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 57, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774443447.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55740.001, raw_value=55740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 28, 901071, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 903985, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904024, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904034, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904045, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904059, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904071, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904094, tzinfo=datetime.timezone.utc))} (T+55743069 ms) 2026-03-25 12:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 56, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774443387.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55680.001, raw_value=55680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904076, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904106, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904118, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904189, tzinfo=datetime.timezone.utc))} (T+55743070 ms) 2026-03-25 12:57:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55743070 ms) 2026-03-25 12:57:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55743071 ms) 2026-03-25 12:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 57, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774443447.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55740.001, raw_value=55740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 28, 901071, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 903985, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904024, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904034, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904045, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904059, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904071, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904094, tzinfo=datetime.timezone.utc))} (T+55743071 ms) 2026-03-25 12:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 56, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774443387.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55680.001, raw_value=55680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 27, 878524, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904076, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904106, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904118, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904129, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904140, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904151, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904162, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904172, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 56, 30, 904189, tzinfo=datetime.timezone.utc))} (T+55743072 ms) 2026-03-25 12:58:30.904 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55803065 ms) 2026-03-25 12:58:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55803066 ms) 2026-03-25 12:58:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 58, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774443507.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55800.001, raw_value=55800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 28, 899802, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901345, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901373, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901388, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901454, tzinfo=datetime.timezone.utc))} (T+55803066 ms) 2026-03-25 12:58:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 57, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774443447.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55740.001, raw_value=55740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 28, 901071, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 903985, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904024, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904034, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904045, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904059, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904071, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904094, tzinfo=datetime.timezone.utc))} (T+55803067 ms) 2026-03-25 12:58:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55803068 ms) 2026-03-25 12:58:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55803068 ms) 2026-03-25 12:58:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 58, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774443507.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55800.001, raw_value=55800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 28, 899802, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901345, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901373, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901388, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901454, tzinfo=datetime.timezone.utc))} (T+55803068 ms) 2026-03-25 12:58:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 57, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774443447.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878326, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55740.001, raw_value=55740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 27, 878555, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 28, 901071, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 903985, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904024, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904034, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904045, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904059, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904071, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904081, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 57, 30, 904094, tzinfo=datetime.timezone.utc))} (T+55803069 ms) 2026-03-25 12:59:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55863067 ms) 2026-03-25 12:59:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55863068 ms) 2026-03-25 12:59:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 59, 27, 878132, tzinfo=datetime.timezone.utc), raw_value=1774443567.878132, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878244, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55860.001, raw_value=55860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 28, 900348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903272, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903299, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903311, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903321, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903331, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903341, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903378, tzinfo=datetime.timezone.utc))} (T+55863068 ms) 2026-03-25 12:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 58, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774443507.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55800.001, raw_value=55800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 28, 899802, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901345, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901373, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901388, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901454, tzinfo=datetime.timezone.utc))} (T+55863069 ms) 2026-03-25 12:59:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55863070 ms) 2026-03-25 12:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55863070 ms) 2026-03-25 12:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 59, 27, 878132, tzinfo=datetime.timezone.utc), raw_value=1774443567.878132, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878244, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55860.001, raw_value=55860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 28, 900348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903272, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903299, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903311, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903321, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903331, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903341, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903378, tzinfo=datetime.timezone.utc))} (T+55863071 ms) 2026-03-25 12:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 58, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774443507.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55800.001, raw_value=55800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 28, 899802, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901345, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901373, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901388, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 58, 30, 901454, tzinfo=datetime.timezone.utc))} (T+55863072 ms) 2026-03-25 13:00:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55923068 ms) 2026-03-25 13:00:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55923068 ms) 2026-03-25 13:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 0, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443627.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55920.001, raw_value=55920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 28, 901221, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904122, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904150, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904161, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904171, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904181, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904191, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904202, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904212, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904227, tzinfo=datetime.timezone.utc))} (T+55923069 ms) 2026-03-25 13:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 59, 27, 878132, tzinfo=datetime.timezone.utc), raw_value=1774443567.878132, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878244, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55860.001, raw_value=55860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 28, 900348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903272, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903299, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903311, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903321, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903331, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903341, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903378, tzinfo=datetime.timezone.utc))} (T+55923070 ms) 2026-03-25 13:00:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55923071 ms) 2026-03-25 13:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55923071 ms) 2026-03-25 13:00:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 0, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443627.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55920.001, raw_value=55920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 28, 901221, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904122, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904150, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904161, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904171, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904181, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904191, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904202, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904212, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904227, tzinfo=datetime.timezone.utc))} (T+55923072 ms) 2026-03-25 13:00:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 12, 59, 27, 878132, tzinfo=datetime.timezone.utc), raw_value=1774443567.878132, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878244, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55860.001, raw_value=55860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 28, 900348, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903272, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903299, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903311, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903321, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903331, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903341, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903352, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 12, 59, 30, 903378, tzinfo=datetime.timezone.utc))} (T+55923073 ms) 2026-03-25 13:01:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+55983068 ms) 2026-03-25 13:01:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+55983068 ms) 2026-03-25 13:01:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 1, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774443687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55980.001, raw_value=55980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 28, 900987, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903856, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903882, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903893, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903904, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903925, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903946, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903962, tzinfo=datetime.timezone.utc))} (T+55983069 ms) 2026-03-25 13:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 0, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443627.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55920.001, raw_value=55920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 28, 901221, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904122, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904150, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904161, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904171, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904181, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904191, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904202, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904212, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904227, tzinfo=datetime.timezone.utc))} (T+55983070 ms) 2026-03-25 13:01:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+55983071 ms) 2026-03-25 13:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+55983071 ms) 2026-03-25 13:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 1, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774443687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55980.001, raw_value=55980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 28, 900987, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903856, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903882, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903893, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903904, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903925, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903946, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903962, tzinfo=datetime.timezone.utc))} (T+55983072 ms) 2026-03-25 13:01:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 0, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443627.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55920.001, raw_value=55920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 27, 878535, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 28, 901221, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904122, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904150, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904161, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904171, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904181, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904191, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904202, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904212, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 0, 30, 904227, tzinfo=datetime.timezone.utc))} (T+55983073 ms) 2026-03-25 13:02:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56043068 ms) 2026-03-25 13:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56043068 ms) 2026-03-25 13:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443747.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56040.001, raw_value=56040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 28, 901034, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903917, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903943, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903958, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904026, tzinfo=datetime.timezone.utc))} (T+56043069 ms) 2026-03-25 13:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 1, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774443687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55980.001, raw_value=55980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 28, 900987, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903856, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903882, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903893, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903904, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903925, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903946, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903962, tzinfo=datetime.timezone.utc))} (T+56043070 ms) 2026-03-25 13:02:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56043071 ms) 2026-03-25 13:02:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56043071 ms) 2026-03-25 13:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443747.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56040.001, raw_value=56040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 28, 901034, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903917, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903943, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903958, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904026, tzinfo=datetime.timezone.utc))} (T+56043072 ms) 2026-03-25 13:02:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 1, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774443687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878313, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=55980.001, raw_value=55980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 28, 900987, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903856, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903882, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903893, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903904, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903914, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903925, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903936, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903946, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 1, 30, 903962, tzinfo=datetime.timezone.utc))} (T+56043073 ms) 2026-03-25 13:03:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56103067 ms) 2026-03-25 13:03:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56103067 ms) 2026-03-25 13:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 3, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774443807.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56100.001, raw_value=56100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878557, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 28, 900162, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 902972, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903000, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903011, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903053, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903078, tzinfo=datetime.timezone.utc))} (T+56103068 ms) 2026-03-25 13:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443747.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56040.001, raw_value=56040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 28, 901034, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903917, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903943, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903958, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904026, tzinfo=datetime.timezone.utc))} (T+56103069 ms) 2026-03-25 13:03:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56103070 ms) 2026-03-25 13:03:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56103070 ms) 2026-03-25 13:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 3, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774443807.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56100.001, raw_value=56100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878557, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 28, 900162, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 902972, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903000, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903011, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903053, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903078, tzinfo=datetime.timezone.utc))} (T+56103071 ms) 2026-03-25 13:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 2, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774443747.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56040.001, raw_value=56040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 28, 901034, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903917, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903943, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903958, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904010, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 2, 30, 904026, tzinfo=datetime.timezone.utc))} (T+56103072 ms) 2026-03-25 13:04:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56163067 ms) 2026-03-25 13:04:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56163068 ms) 2026-03-25 13:04:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 4, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774443867.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56160.001, raw_value=56160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 28, 900240, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903240, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903252, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903262, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903273, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903283, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903326, tzinfo=datetime.timezone.utc))} (T+56163069 ms) 2026-03-25 13:04:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 3, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774443807.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56100.001, raw_value=56100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878557, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 28, 900162, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 902972, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903000, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903011, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903053, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903078, tzinfo=datetime.timezone.utc))} (T+56163069 ms) 2026-03-25 13:04:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56163070 ms) 2026-03-25 13:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56163070 ms) 2026-03-25 13:04:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 4, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774443867.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56160.001, raw_value=56160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 28, 900240, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903240, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903252, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903262, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903273, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903283, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903326, tzinfo=datetime.timezone.utc))} (T+56163076 ms) 2026-03-25 13:04:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 3, 27, 878203, tzinfo=datetime.timezone.utc), raw_value=1774443807.878203, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56100.001, raw_value=56100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 27, 878557, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 28, 900162, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 902972, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903000, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903011, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903021, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903053, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 3, 30, 903078, tzinfo=datetime.timezone.utc))} (T+56163077 ms) 2026-03-25 13:05:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56223067 ms) 2026-03-25 13:05:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56223067 ms) 2026-03-25 13:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 5, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774443927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56220.001, raw_value=56220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 28, 900276, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903199, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903226, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903237, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903247, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903257, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903267, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903279, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903304, tzinfo=datetime.timezone.utc))} (T+56223068 ms) 2026-03-25 13:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 4, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774443867.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56160.001, raw_value=56160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 28, 900240, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903240, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903252, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903262, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903273, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903283, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903326, tzinfo=datetime.timezone.utc))} (T+56223069 ms) 2026-03-25 13:05:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56223070 ms) 2026-03-25 13:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56223070 ms) 2026-03-25 13:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 5, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774443927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56220.001, raw_value=56220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 28, 900276, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903199, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903226, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903237, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903247, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903257, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903267, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903279, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903304, tzinfo=datetime.timezone.utc))} (T+56223071 ms) 2026-03-25 13:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 4, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774443867.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56160.001, raw_value=56160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 27, 878469, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 28, 900240, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903211, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903240, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903252, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903262, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903273, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903283, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903295, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 4, 30, 903326, tzinfo=datetime.timezone.utc))} (T+56223072 ms) 2026-03-25 13:06:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56283068 ms) 2026-03-25 13:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56283068 ms) 2026-03-25 13:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 6, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774443987.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56280.001, raw_value=56280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 28, 900726, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903781, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903810, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903870, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903880, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903894, tzinfo=datetime.timezone.utc))} (T+56283069 ms) 2026-03-25 13:06:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 5, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774443927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56220.001, raw_value=56220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 28, 900276, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903199, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903226, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903237, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903247, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903257, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903267, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903279, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903304, tzinfo=datetime.timezone.utc))} (T+56283070 ms) 2026-03-25 13:06:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56283070 ms) 2026-03-25 13:06:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56283071 ms) 2026-03-25 13:06:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 6, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774443987.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56280.001, raw_value=56280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 28, 900726, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903781, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903810, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903870, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903880, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903894, tzinfo=datetime.timezone.utc))} (T+56283078 ms) 2026-03-25 13:06:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 5, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774443927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56220.001, raw_value=56220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 28, 900276, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903199, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903226, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903237, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903247, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903257, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903267, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903279, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 5, 30, 903304, tzinfo=datetime.timezone.utc))} (T+56283078 ms) 2026-03-25 13:07:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56343068 ms) 2026-03-25 13:07:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56343069 ms) 2026-03-25 13:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 7, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774444047.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56340.001, raw_value=56340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878584, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904373, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904401, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904413, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904435, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904445, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904456, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904466, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904480, tzinfo=datetime.timezone.utc))} (T+56343071 ms) 2026-03-25 13:07:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 6, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774443987.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56280.001, raw_value=56280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 28, 900726, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903781, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903810, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903870, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903880, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903894, tzinfo=datetime.timezone.utc))} (T+56343072 ms) 2026-03-25 13:07:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56343072 ms) 2026-03-25 13:07:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56343072 ms) 2026-03-25 13:07:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 7, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774444047.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56340.001, raw_value=56340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878584, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904373, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904401, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904413, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904435, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904445, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904456, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904466, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904480, tzinfo=datetime.timezone.utc))} (T+56343077 ms) 2026-03-25 13:07:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 6, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774443987.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56280.001, raw_value=56280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 28, 900726, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903781, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903810, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903825, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903858, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903870, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903880, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 6, 30, 903894, tzinfo=datetime.timezone.utc))} (T+56343078 ms) 2026-03-25 13:08:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56403068 ms) 2026-03-25 13:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56403069 ms) 2026-03-25 13:08:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 8, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774444107.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878359, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56400.001, raw_value=56400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878820, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904510, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904541, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904554, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904570, tzinfo=datetime.timezone.utc))} (T+56403069 ms) 2026-03-25 13:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 7, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774444047.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56340.001, raw_value=56340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878584, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904373, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904401, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904413, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904435, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904445, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904456, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904466, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904480, tzinfo=datetime.timezone.utc))} (T+56403070 ms) 2026-03-25 13:08:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56403071 ms) 2026-03-25 13:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56403071 ms) 2026-03-25 13:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 8, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774444107.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878359, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56400.001, raw_value=56400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878820, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904510, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904541, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904554, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904570, tzinfo=datetime.timezone.utc))} (T+56403071 ms) 2026-03-25 13:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 7, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774444047.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56340.001, raw_value=56340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 27, 878584, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904373, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904401, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904413, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904435, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904445, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904456, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904466, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 7, 30, 904480, tzinfo=datetime.timezone.utc))} (T+56403072 ms) 2026-03-25 13:09:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56463067 ms) 2026-03-25 13:09:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56463068 ms) 2026-03-25 13:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 9, 27, 878217, tzinfo=datetime.timezone.utc), raw_value=1774444167.878217, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56460.001, raw_value=56460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 28, 900627, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903611, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903639, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903691, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903714, tzinfo=datetime.timezone.utc))} (T+56463069 ms) 2026-03-25 13:09:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 8, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774444107.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878359, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56400.001, raw_value=56400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878820, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904510, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904541, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904554, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904570, tzinfo=datetime.timezone.utc))} (T+56463069 ms) 2026-03-25 13:09:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56463070 ms) 2026-03-25 13:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56463070 ms) 2026-03-25 13:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 9, 27, 878217, tzinfo=datetime.timezone.utc), raw_value=1774444167.878217, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56460.001, raw_value=56460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 28, 900627, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903611, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903639, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903691, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903714, tzinfo=datetime.timezone.utc))} (T+56463071 ms) 2026-03-25 13:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 8, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774444107.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878359, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56400.001, raw_value=56400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 27, 878820, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904459, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904487, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904499, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904510, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904520, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904541, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904554, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 8, 30, 904570, tzinfo=datetime.timezone.utc))} (T+56463071 ms) 2026-03-25 13:10:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56523068 ms) 2026-03-25 13:10:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56523069 ms) 2026-03-25 13:10:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 10, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774444227.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56520.001, raw_value=56520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878550, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 28, 901747, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904694, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904723, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904772, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904793, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904809, tzinfo=datetime.timezone.utc))} (T+56523070 ms) 2026-03-25 13:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 9, 27, 878217, tzinfo=datetime.timezone.utc), raw_value=1774444167.878217, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56460.001, raw_value=56460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 28, 900627, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903611, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903639, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903691, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903714, tzinfo=datetime.timezone.utc))} (T+56523071 ms) 2026-03-25 13:10:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56523072 ms) 2026-03-25 13:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56523072 ms) 2026-03-25 13:10:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 10, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774444227.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56520.001, raw_value=56520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878550, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 28, 901747, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904694, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904723, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904772, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904793, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904809, tzinfo=datetime.timezone.utc))} (T+56523072 ms) 2026-03-25 13:10:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 9, 27, 878217, tzinfo=datetime.timezone.utc), raw_value=1774444167.878217, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878328, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56460.001, raw_value=56460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 27, 878538, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 28, 900627, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903611, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903639, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903679, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903691, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903700, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 9, 30, 903714, tzinfo=datetime.timezone.utc))} (T+56523073 ms) 2026-03-25 13:11:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56583067 ms) 2026-03-25 13:11:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56583068 ms) 2026-03-25 13:11:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 11, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774444287.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56580.001, raw_value=56580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 28, 900358, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903319, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903347, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903358, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903400, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903423, tzinfo=datetime.timezone.utc))} (T+56583068 ms) 2026-03-25 13:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 10, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774444227.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56520.001, raw_value=56520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878550, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 28, 901747, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904694, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904723, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904772, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904793, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904809, tzinfo=datetime.timezone.utc))} (T+56583069 ms) 2026-03-25 13:11:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56583070 ms) 2026-03-25 13:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56583070 ms) 2026-03-25 13:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 11, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774444287.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56580.001, raw_value=56580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 28, 900358, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903319, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903347, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903358, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903400, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903423, tzinfo=datetime.timezone.utc))} (T+56583070 ms) 2026-03-25 13:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 10, 27, 878175, tzinfo=datetime.timezone.utc), raw_value=1774444227.878175, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56520.001, raw_value=56520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 27, 878550, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 28, 901747, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904694, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904723, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904738, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904748, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904772, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904793, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 10, 30, 904809, tzinfo=datetime.timezone.utc))} (T+56583071 ms) 2026-03-25 13:12:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56643067 ms) 2026-03-25 13:12:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56643068 ms) 2026-03-25 13:12:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 12, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774444347.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56640.001, raw_value=56640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 28, 900285, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903252, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903298, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903310, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903323, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903337, tzinfo=datetime.timezone.utc))} (T+56643068 ms) 2026-03-25 13:12:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 11, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774444287.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56580.001, raw_value=56580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 28, 900358, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903319, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903347, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903358, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903400, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903423, tzinfo=datetime.timezone.utc))} (T+56643069 ms) 2026-03-25 13:12:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56643070 ms) 2026-03-25 13:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56643070 ms) 2026-03-25 13:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 12, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774444347.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56640.001, raw_value=56640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 28, 900285, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903252, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903298, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903310, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903323, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903337, tzinfo=datetime.timezone.utc))} (T+56643071 ms) 2026-03-25 13:12:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 11, 27, 878148, tzinfo=datetime.timezone.utc), raw_value=1774444287.878148, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878255, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56580.001, raw_value=56580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 27, 878467, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 28, 900358, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903319, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903347, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903358, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903368, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903378, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903389, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903400, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903410, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 11, 30, 903423, tzinfo=datetime.timezone.utc))} (T+56643071 ms) 2026-03-25 13:13:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56703067 ms) 2026-03-25 13:13:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56703068 ms) 2026-03-25 13:13:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 13, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774444407.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56700.001, raw_value=56700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 28, 900500, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903527, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903568, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903594, tzinfo=datetime.timezone.utc))} (T+56703069 ms) 2026-03-25 13:13:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 12, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774444347.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56640.001, raw_value=56640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 28, 900285, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903252, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903298, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903310, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903323, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903337, tzinfo=datetime.timezone.utc))} (T+56703069 ms) 2026-03-25 13:13:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56703070 ms) 2026-03-25 13:13:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56703070 ms) 2026-03-25 13:13:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 13, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774444407.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56700.001, raw_value=56700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 28, 900500, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903527, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903568, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903594, tzinfo=datetime.timezone.utc))} (T+56703077 ms) 2026-03-25 13:13:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 12, 27, 878143, tzinfo=datetime.timezone.utc), raw_value=1774444347.878143, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878248, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56640.001, raw_value=56640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 28, 900285, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903252, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903298, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903310, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903323, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 12, 30, 903337, tzinfo=datetime.timezone.utc))} (T+56703078 ms) 2026-03-25 13:14:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56763068 ms) 2026-03-25 13:14:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56763069 ms) 2026-03-25 13:14:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 14, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774444467.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56760.001, raw_value=56760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878563, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904200, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904236, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904254, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904275, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904298, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904324, tzinfo=datetime.timezone.utc))} (T+56763072 ms) 2026-03-25 13:14:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 13, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774444407.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56700.001, raw_value=56700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 28, 900500, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903527, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903568, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903594, tzinfo=datetime.timezone.utc))} (T+56763073 ms) 2026-03-25 13:14:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56763074 ms) 2026-03-25 13:14:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56763074 ms) 2026-03-25 13:14:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 14, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774444467.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56760.001, raw_value=56760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878563, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904200, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904236, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904254, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904275, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904298, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904324, tzinfo=datetime.timezone.utc))} (T+56763081 ms) 2026-03-25 13:14:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 13, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774444407.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878302, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56700.001, raw_value=56700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 28, 900500, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903527, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903547, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903557, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903568, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903578, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 13, 30, 903594, tzinfo=datetime.timezone.utc))} (T+56763082 ms) 2026-03-25 13:15:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56823068 ms) 2026-03-25 13:15:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56823068 ms) 2026-03-25 13:15:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 15, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774444527.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56820.001, raw_value=56820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 28, 900742, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903799, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903811, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903853, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903879, tzinfo=datetime.timezone.utc))} (T+56823069 ms) 2026-03-25 13:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 14, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774444467.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56760.001, raw_value=56760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878563, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904200, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904236, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904254, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904275, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904298, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904324, tzinfo=datetime.timezone.utc))} (T+56823072 ms) 2026-03-25 13:15:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56823072 ms) 2026-03-25 13:15:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56823072 ms) 2026-03-25 13:15:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 15, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774444527.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56820.001, raw_value=56820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 28, 900742, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903799, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903811, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903853, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903879, tzinfo=datetime.timezone.utc))} (T+56823077 ms) 2026-03-25 13:15:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 14, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774444467.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56760.001, raw_value=56760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 27, 878563, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 28, 901108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904200, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904236, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904254, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904265, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904275, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904285, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904298, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904308, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 14, 30, 904324, tzinfo=datetime.timezone.utc))} (T+56823078 ms) 2026-03-25 13:16:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56883068 ms) 2026-03-25 13:16:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56883069 ms) 2026-03-25 13:16:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 16, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774444587.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56880.001, raw_value=56880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878551, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904380, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904407, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904418, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904429, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904439, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904450, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904461, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904470, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904486, tzinfo=datetime.timezone.utc))} (T+56883070 ms) 2026-03-25 13:16:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 15, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774444527.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56820.001, raw_value=56820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 28, 900742, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903799, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903811, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903853, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903879, tzinfo=datetime.timezone.utc))} (T+56883071 ms) 2026-03-25 13:16:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56883071 ms) 2026-03-25 13:16:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56883072 ms) 2026-03-25 13:16:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 16, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774444587.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56880.001, raw_value=56880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878551, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904380, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904407, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904418, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904429, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904439, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904450, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904461, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904470, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904486, tzinfo=datetime.timezone.utc))} (T+56883073 ms) 2026-03-25 13:16:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 15, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774444527.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56820.001, raw_value=56820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 28, 900742, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903771, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903799, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903811, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903853, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903864, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 15, 30, 903879, tzinfo=datetime.timezone.utc))} (T+56883073 ms) 2026-03-25 13:17:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+56943068 ms) 2026-03-25 13:17:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+56943068 ms) 2026-03-25 13:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 17, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774444647.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56940.001, raw_value=56940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 28, 901293, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904239, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904266, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904278, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904288, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904299, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904309, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904331, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904349, tzinfo=datetime.timezone.utc))} (T+56943069 ms) 2026-03-25 13:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 16, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774444587.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56880.001, raw_value=56880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878551, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904380, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904407, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904418, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904429, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904439, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904450, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904461, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904470, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904486, tzinfo=datetime.timezone.utc))} (T+56943070 ms) 2026-03-25 13:17:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+56943071 ms) 2026-03-25 13:17:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+56943071 ms) 2026-03-25 13:17:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 17, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774444647.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56940.001, raw_value=56940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 28, 901293, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904239, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904266, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904278, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904288, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904299, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904309, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904331, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904349, tzinfo=datetime.timezone.utc))} (T+56943071 ms) 2026-03-25 13:17:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 16, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774444587.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878322, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56880.001, raw_value=56880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 27, 878551, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 28, 901401, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904380, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904407, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904418, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904429, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904439, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904450, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904461, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904470, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 16, 30, 904486, tzinfo=datetime.timezone.utc))} (T+56943072 ms) 2026-03-25 13:18:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57003067 ms) 2026-03-25 13:18:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57003068 ms) 2026-03-25 13:18:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 18, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774444707.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57000.001, raw_value=57000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 28, 900555, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903575, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903687, tzinfo=datetime.timezone.utc))} (T+57003069 ms) 2026-03-25 13:18:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 17, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774444647.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56940.001, raw_value=56940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 28, 901293, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904239, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904266, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904278, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904288, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904299, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904309, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904331, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904349, tzinfo=datetime.timezone.utc))} (T+57003070 ms) 2026-03-25 13:18:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57003071 ms) 2026-03-25 13:18:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57003071 ms) 2026-03-25 13:18:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 18, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774444707.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57000.001, raw_value=57000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 28, 900555, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903575, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903687, tzinfo=datetime.timezone.utc))} (T+57003072 ms) 2026-03-25 13:18:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 17, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774444647.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878338, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=56940.001, raw_value=56940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 28, 901293, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904239, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904266, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904278, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904288, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904299, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904309, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904321, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904331, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 17, 30, 904349, tzinfo=datetime.timezone.utc))} (T+57003072 ms) 2026-03-25 13:19:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57063067 ms) 2026-03-25 13:19:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57063068 ms) 2026-03-25 13:19:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 19, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774444767.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878245, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57060.001, raw_value=57060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878451, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903545, tzinfo=datetime.timezone.utc))} (T+57063069 ms) 2026-03-25 13:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 18, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774444707.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57000.001, raw_value=57000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 28, 900555, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903575, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903687, tzinfo=datetime.timezone.utc))} (T+57063069 ms) 2026-03-25 13:19:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57063070 ms) 2026-03-25 13:19:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57063070 ms) 2026-03-25 13:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 19, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774444767.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878245, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57060.001, raw_value=57060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878451, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903545, tzinfo=datetime.timezone.utc))} (T+57063071 ms) 2026-03-25 13:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 18, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774444707.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878314, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57000.001, raw_value=57000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 28, 900555, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903575, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903674, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 18, 30, 903687, tzinfo=datetime.timezone.utc))} (T+57063072 ms) 2026-03-25 13:20:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57123068 ms) 2026-03-25 13:20:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57123068 ms) 2026-03-25 13:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 20, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774444827.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57120.001, raw_value=57120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 28, 900968, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903974, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903986, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903996, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904006, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904031, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904057, tzinfo=datetime.timezone.utc))} (T+57123069 ms) 2026-03-25 13:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 19, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774444767.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878245, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57060.001, raw_value=57060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878451, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903545, tzinfo=datetime.timezone.utc))} (T+57123070 ms) 2026-03-25 13:20:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57123071 ms) 2026-03-25 13:20:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57123071 ms) 2026-03-25 13:20:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 20, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774444827.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57120.001, raw_value=57120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 28, 900968, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903974, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903986, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903996, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904006, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904031, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904057, tzinfo=datetime.timezone.utc))} (T+57123072 ms) 2026-03-25 13:20:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 19, 27, 878137, tzinfo=datetime.timezone.utc), raw_value=1774444767.878137, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878245, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57060.001, raw_value=57060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 27, 878451, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903443, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903470, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903481, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903502, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 19, 30, 903545, tzinfo=datetime.timezone.utc))} (T+57123072 ms) 2026-03-25 13:21:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57183068 ms) 2026-03-25 13:21:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57183068 ms) 2026-03-25 13:21:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 21, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774444887.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57180.001, raw_value=57180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903953, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903993, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904046, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904059, tzinfo=datetime.timezone.utc))} (T+57183069 ms) 2026-03-25 13:21:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 20, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774444827.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57120.001, raw_value=57120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 28, 900968, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903974, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903986, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903996, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904006, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904031, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904057, tzinfo=datetime.timezone.utc))} (T+57183070 ms) 2026-03-25 13:21:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57183071 ms) 2026-03-25 13:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57183071 ms) 2026-03-25 13:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 21, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774444887.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57180.001, raw_value=57180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903953, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903993, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904046, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904059, tzinfo=datetime.timezone.utc))} (T+57183072 ms) 2026-03-25 13:21:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 20, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774444827.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57120.001, raw_value=57120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 28, 900968, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903946, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903974, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903986, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 903996, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904006, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904020, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904031, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904041, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 20, 30, 904057, tzinfo=datetime.timezone.utc))} (T+57183072 ms) 2026-03-25 13:22:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57243068 ms) 2026-03-25 13:22:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57243068 ms) 2026-03-25 13:22:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 22, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774444947.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57240.001, raw_value=57240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 28, 900492, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903543, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903569, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903580, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903593, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903605, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903615, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903631, tzinfo=datetime.timezone.utc))} (T+57243069 ms) 2026-03-25 13:22:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 21, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774444887.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57180.001, raw_value=57180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903953, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903993, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904046, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904059, tzinfo=datetime.timezone.utc))} (T+57243070 ms) 2026-03-25 13:22:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57243071 ms) 2026-03-25 13:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57243071 ms) 2026-03-25 13:22:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 22, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774444947.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57240.001, raw_value=57240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 28, 900492, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903543, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903569, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903580, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903593, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903605, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903615, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903631, tzinfo=datetime.timezone.utc))} (T+57243072 ms) 2026-03-25 13:22:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 21, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774444887.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57180.001, raw_value=57180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903953, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903982, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 903993, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904004, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904014, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904036, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904046, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 21, 30, 904059, tzinfo=datetime.timezone.utc))} (T+57243073 ms) 2026-03-25 13:23:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57303068 ms) 2026-03-25 13:23:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57303068 ms) 2026-03-25 13:23:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 23, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774445007.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878352, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57300.001, raw_value=57300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878598, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 28, 900750, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903766, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903793, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903814, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903861, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903877, tzinfo=datetime.timezone.utc))} (T+57303069 ms) 2026-03-25 13:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 22, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774444947.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57240.001, raw_value=57240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 28, 900492, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903543, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903569, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903580, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903593, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903605, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903615, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903631, tzinfo=datetime.timezone.utc))} (T+57303070 ms) 2026-03-25 13:23:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57303071 ms) 2026-03-25 13:23:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57303071 ms) 2026-03-25 13:23:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 23, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774445007.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878352, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57300.001, raw_value=57300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878598, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 28, 900750, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903766, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903793, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903814, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903861, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903877, tzinfo=datetime.timezone.utc))} (T+57303072 ms) 2026-03-25 13:23:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 22, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774444947.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57240.001, raw_value=57240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 28, 900492, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903543, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903558, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903569, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903580, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903593, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903605, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903615, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 22, 30, 903631, tzinfo=datetime.timezone.utc))} (T+57303073 ms) 2026-03-25 13:24:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57363069 ms) 2026-03-25 13:24:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57363069 ms) 2026-03-25 13:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774445067.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57360.001, raw_value=57360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878595, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 28, 902108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905115, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905165, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905175, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905185, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905196, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905206, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905221, tzinfo=datetime.timezone.utc))} (T+57363070 ms) 2026-03-25 13:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 23, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774445007.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878352, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57300.001, raw_value=57300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878598, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 28, 900750, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903766, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903793, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903814, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903861, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903877, tzinfo=datetime.timezone.utc))} (T+57363071 ms) 2026-03-25 13:24:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57363072 ms) 2026-03-25 13:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57363072 ms) 2026-03-25 13:24:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774445067.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57360.001, raw_value=57360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878595, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 28, 902108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905115, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905165, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905175, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905185, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905196, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905206, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905221, tzinfo=datetime.timezone.utc))} (T+57363073 ms) 2026-03-25 13:24:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 23, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774445007.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878352, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57300.001, raw_value=57300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 27, 878598, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 28, 900750, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903766, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903793, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903814, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903861, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 23, 30, 903877, tzinfo=datetime.timezone.utc))} (T+57363074 ms) 2026-03-25 13:25:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57423067 ms) 2026-03-25 13:25:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57423068 ms) 2026-03-25 13:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 25, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774445127.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57420.001, raw_value=57420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903458, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903469, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903511, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903539, tzinfo=datetime.timezone.utc))} (T+57423069 ms) 2026-03-25 13:25:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774445067.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57360.001, raw_value=57360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878595, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 28, 902108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905115, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905165, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905175, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905185, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905196, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905206, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905221, tzinfo=datetime.timezone.utc))} (T+57423070 ms) 2026-03-25 13:25:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57423070 ms) 2026-03-25 13:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57423071 ms) 2026-03-25 13:25:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 25, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774445127.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57420.001, raw_value=57420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903458, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903469, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903511, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903539, tzinfo=datetime.timezone.utc))} (T+57423072 ms) 2026-03-25 13:25:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 24, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774445067.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878324, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57360.001, raw_value=57360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 27, 878595, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 28, 902108, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905115, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905142, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905154, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905165, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905175, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905185, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905196, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905206, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 24, 30, 905221, tzinfo=datetime.timezone.utc))} (T+57423073 ms) 2026-03-25 13:26:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57483067 ms) 2026-03-25 13:26:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57483068 ms) 2026-03-25 13:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 26, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774445187.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57480.001, raw_value=57480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903540, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903569, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903583, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903594, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903615, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903626, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903652, tzinfo=datetime.timezone.utc))} (T+57483069 ms) 2026-03-25 13:26:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 25, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774445127.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57420.001, raw_value=57420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903458, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903469, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903511, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903539, tzinfo=datetime.timezone.utc))} (T+57483070 ms) 2026-03-25 13:26:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57483071 ms) 2026-03-25 13:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57483071 ms) 2026-03-25 13:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 26, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774445187.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57480.001, raw_value=57480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903540, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903569, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903583, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903594, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903615, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903626, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903652, tzinfo=datetime.timezone.utc))} (T+57483072 ms) 2026-03-25 13:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 25, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774445127.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878278, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57420.001, raw_value=57420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 28, 900362, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903458, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903469, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903490, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903500, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903511, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 25, 30, 903539, tzinfo=datetime.timezone.utc))} (T+57483073 ms) 2026-03-25 13:27:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57543067 ms) 2026-03-25 13:27:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57543068 ms) 2026-03-25 13:27:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 27, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774445247.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57540.001, raw_value=57540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 28, 900198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903221, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903249, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903260, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903270, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903280, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903290, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903301, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903330, tzinfo=datetime.timezone.utc))} (T+57543069 ms) 2026-03-25 13:27:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 26, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774445187.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57480.001, raw_value=57480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903540, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903569, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903583, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903594, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903615, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903626, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903652, tzinfo=datetime.timezone.utc))} (T+57543070 ms) 2026-03-25 13:27:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57543070 ms) 2026-03-25 13:27:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57543071 ms) 2026-03-25 13:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 27, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774445247.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57540.001, raw_value=57540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 28, 900198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903221, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903249, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903260, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903270, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903280, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903290, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903301, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903330, tzinfo=datetime.timezone.utc))} (T+57543072 ms) 2026-03-25 13:27:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 26, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774445187.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57480.001, raw_value=57480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 28, 900558, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903540, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903569, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903583, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903594, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903615, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903626, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903636, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 26, 30, 903652, tzinfo=datetime.timezone.utc))} (T+57543073 ms) 2026-03-25 13:28:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57603068 ms) 2026-03-25 13:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57603068 ms) 2026-03-25 13:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 28, 27, 878262, tzinfo=datetime.timezone.utc), raw_value=1774445307.878262, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878375, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57600.001, raw_value=57600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903968, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904050, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904075, tzinfo=datetime.timezone.utc))} (T+57603069 ms) 2026-03-25 13:28:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 27, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774445247.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57540.001, raw_value=57540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 28, 900198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903221, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903249, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903260, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903270, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903280, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903290, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903301, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903330, tzinfo=datetime.timezone.utc))} (T+57603070 ms) 2026-03-25 13:28:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57603070 ms) 2026-03-25 13:28:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57603070 ms) 2026-03-25 13:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 28, 27, 878262, tzinfo=datetime.timezone.utc), raw_value=1774445307.878262, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878375, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57600.001, raw_value=57600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903968, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904050, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904075, tzinfo=datetime.timezone.utc))} (T+57603071 ms) 2026-03-25 13:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 27, 27, 878153, tzinfo=datetime.timezone.utc), raw_value=1774445247.878153, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57540.001, raw_value=57540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 28, 900198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903221, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903249, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903260, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903270, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903280, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903290, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903301, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903312, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 27, 30, 903330, tzinfo=datetime.timezone.utc))} (T+57603072 ms) 2026-03-25 13:29:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57663068 ms) 2026-03-25 13:29:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57663068 ms) 2026-03-25 13:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 29, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774445367.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57660.001, raw_value=57660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 28, 900774, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903789, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903817, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903828, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903875, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903885, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903901, tzinfo=datetime.timezone.utc))} (T+57663069 ms) 2026-03-25 13:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 28, 27, 878262, tzinfo=datetime.timezone.utc), raw_value=1774445307.878262, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878375, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57600.001, raw_value=57600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903968, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904050, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904075, tzinfo=datetime.timezone.utc))} (T+57663070 ms) 2026-03-25 13:29:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57663070 ms) 2026-03-25 13:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57663070 ms) 2026-03-25 13:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 29, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774445367.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57660.001, raw_value=57660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 28, 900774, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903789, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903817, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903828, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903875, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903885, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903901, tzinfo=datetime.timezone.utc))} (T+57663071 ms) 2026-03-25 13:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 28, 27, 878262, tzinfo=datetime.timezone.utc), raw_value=1774445307.878262, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878375, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57600.001, raw_value=57600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 27, 878588, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903968, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 903997, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904008, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904018, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904028, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904039, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904050, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904059, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 28, 30, 904075, tzinfo=datetime.timezone.utc))} (T+57663072 ms) 2026-03-25 13:30:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57723066 ms) 2026-03-25 13:30:30.905 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57723067 ms) 2026-03-25 13:30:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 30, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774445427.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57720.001, raw_value=57720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 28, 899623, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902667, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902681, tzinfo=datetime.timezone.utc))} (T+57723068 ms) 2026-03-25 13:30:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 29, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774445367.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57660.001, raw_value=57660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 28, 900774, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903789, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903817, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903828, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903875, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903885, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903901, tzinfo=datetime.timezone.utc))} (T+57723068 ms) 2026-03-25 13:30:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57723069 ms) 2026-03-25 13:30:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57723069 ms) 2026-03-25 13:30:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 30, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774445427.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57720.001, raw_value=57720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 28, 899623, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902667, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902681, tzinfo=datetime.timezone.utc))} (T+57723070 ms) 2026-03-25 13:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 29, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774445367.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57660.001, raw_value=57660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 28, 900774, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903789, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903817, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903828, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903839, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903849, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903859, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903875, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903885, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 29, 30, 903901, tzinfo=datetime.timezone.utc))} (T+57723070 ms) 2026-03-25 13:31:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57783068 ms) 2026-03-25 13:31:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57783068 ms) 2026-03-25 13:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445487.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57780.001, raw_value=57780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 28, 900370, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903448, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903478, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903489, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903517, tzinfo=datetime.timezone.utc))} (T+57783069 ms) 2026-03-25 13:31:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 30, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774445427.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57720.001, raw_value=57720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 28, 899623, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902667, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902681, tzinfo=datetime.timezone.utc))} (T+57783069 ms) 2026-03-25 13:31:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57783070 ms) 2026-03-25 13:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57783070 ms) 2026-03-25 13:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445487.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57780.001, raw_value=57780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 28, 900370, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903448, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903478, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903489, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903517, tzinfo=datetime.timezone.utc))} (T+57783071 ms) 2026-03-25 13:31:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 30, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774445427.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57720.001, raw_value=57720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 28, 899623, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902572, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902612, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902623, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902634, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902643, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902654, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902667, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 30, 30, 902681, tzinfo=datetime.timezone.utc))} (T+57783073 ms) 2026-03-25 13:32:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57843067 ms) 2026-03-25 13:32:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57843068 ms) 2026-03-25 13:32:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 32, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774445547.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878267, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57840.001, raw_value=57840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 28, 900445, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903493, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903536, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903573, tzinfo=datetime.timezone.utc))} (T+57843069 ms) 2026-03-25 13:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445487.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57780.001, raw_value=57780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 28, 900370, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903448, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903478, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903489, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903517, tzinfo=datetime.timezone.utc))} (T+57843070 ms) 2026-03-25 13:32:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57843071 ms) 2026-03-25 13:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57843071 ms) 2026-03-25 13:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 32, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774445547.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878267, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57840.001, raw_value=57840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 28, 900445, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903493, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903536, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903573, tzinfo=datetime.timezone.utc))} (T+57843072 ms) 2026-03-25 13:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445487.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57780.001, raw_value=57780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 28, 900370, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903448, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903478, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903489, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903503, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 31, 30, 903517, tzinfo=datetime.timezone.utc))} (T+57843072 ms) 2026-03-25 13:33:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57903068 ms) 2026-03-25 13:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57903068 ms) 2026-03-25 13:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 33, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445607.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57900.001, raw_value=57900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 28, 900683, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903814, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903826, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903892, tzinfo=datetime.timezone.utc))} (T+57903069 ms) 2026-03-25 13:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 32, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774445547.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878267, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57840.001, raw_value=57840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 28, 900445, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903493, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903536, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903573, tzinfo=datetime.timezone.utc))} (T+57903070 ms) 2026-03-25 13:33:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57903071 ms) 2026-03-25 13:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57903071 ms) 2026-03-25 13:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 33, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445607.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57900.001, raw_value=57900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 28, 900683, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903814, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903826, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903892, tzinfo=datetime.timezone.utc))} (T+57903072 ms) 2026-03-25 13:33:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 32, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774445547.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878267, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57840.001, raw_value=57840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 28, 900445, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903464, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903493, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903506, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903526, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903536, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903547, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903557, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 32, 30, 903573, tzinfo=datetime.timezone.utc))} (T+57903072 ms) 2026-03-25 13:34:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+57963067 ms) 2026-03-25 13:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+57963068 ms) 2026-03-25 13:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 34, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445667.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57960.001, raw_value=57960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903595, tzinfo=datetime.timezone.utc))} (T+57963070 ms) 2026-03-25 13:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 33, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445607.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57900.001, raw_value=57900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 28, 900683, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903814, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903826, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903892, tzinfo=datetime.timezone.utc))} (T+57963071 ms) 2026-03-25 13:34:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+57963072 ms) 2026-03-25 13:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+57963072 ms) 2026-03-25 13:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 34, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445667.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57960.001, raw_value=57960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903595, tzinfo=datetime.timezone.utc))} (T+57963072 ms) 2026-03-25 13:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 33, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774445607.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57900.001, raw_value=57900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 27, 878503, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 28, 900683, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903787, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903814, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903826, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903836, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903847, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903869, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903879, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 33, 30, 903892, tzinfo=datetime.timezone.utc))} (T+57963073 ms) 2026-03-25 13:35:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58023068 ms) 2026-03-25 13:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58023069 ms) 2026-03-25 13:35:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 35, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774445727.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58020.001, raw_value=58020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 28, 901236, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904202, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904242, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904263, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904287, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904296, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904312, tzinfo=datetime.timezone.utc))} (T+58023070 ms) 2026-03-25 13:35:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 34, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445667.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57960.001, raw_value=57960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903595, tzinfo=datetime.timezone.utc))} (T+58023071 ms) 2026-03-25 13:35:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58023071 ms) 2026-03-25 13:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58023071 ms) 2026-03-25 13:35:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 35, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774445727.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58020.001, raw_value=58020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 28, 901236, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904202, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904242, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904263, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904287, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904296, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904312, tzinfo=datetime.timezone.utc))} (T+58023072 ms) 2026-03-25 13:35:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 34, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445667.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878279, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=57960.001, raw_value=57960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 27, 878496, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 28, 900461, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903487, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903515, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903530, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903561, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903572, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 34, 30, 903595, tzinfo=datetime.timezone.utc))} (T+58023073 ms) 2026-03-25 13:36:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58083068 ms) 2026-03-25 13:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58083068 ms) 2026-03-25 13:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 36, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445787.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58080.001, raw_value=58080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903729, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903758, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903790, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903840, tzinfo=datetime.timezone.utc))} (T+58083070 ms) 2026-03-25 13:36:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 35, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774445727.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58020.001, raw_value=58020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 28, 901236, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904202, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904242, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904263, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904287, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904296, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904312, tzinfo=datetime.timezone.utc))} (T+58083071 ms) 2026-03-25 13:36:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58083072 ms) 2026-03-25 13:36:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58083072 ms) 2026-03-25 13:36:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 36, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445787.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58080.001, raw_value=58080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903729, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903758, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903790, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903840, tzinfo=datetime.timezone.utc))} (T+58083076 ms) 2026-03-25 13:36:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 35, 27, 878170, tzinfo=datetime.timezone.utc), raw_value=1774445727.87817, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58020.001, raw_value=58020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 27, 878514, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 28, 901236, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904202, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904231, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904242, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904252, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904263, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904287, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904296, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 35, 30, 904312, tzinfo=datetime.timezone.utc))} (T+58083077 ms) 2026-03-25 13:37:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58143067 ms) 2026-03-25 13:37:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58143068 ms) 2026-03-25 13:37:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 37, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774445847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58140.001, raw_value=58140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 28, 900546, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903570, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903609, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903620, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903651, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903676, tzinfo=datetime.timezone.utc))} (T+58143069 ms) 2026-03-25 13:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 36, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445787.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58080.001, raw_value=58080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903729, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903758, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903790, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903840, tzinfo=datetime.timezone.utc))} (T+58143070 ms) 2026-03-25 13:37:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58143071 ms) 2026-03-25 13:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58143071 ms) 2026-03-25 13:37:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 37, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774445847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58140.001, raw_value=58140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 28, 900546, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903570, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903609, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903620, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903651, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903676, tzinfo=datetime.timezone.utc))} (T+58143072 ms) 2026-03-25 13:37:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 36, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445787.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58080.001, raw_value=58080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 27, 878485, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903729, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903758, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903770, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903780, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903790, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903824, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 36, 30, 903840, tzinfo=datetime.timezone.utc))} (T+58143073 ms) 2026-03-25 13:38:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58203067 ms) 2026-03-25 13:38:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58203068 ms) 2026-03-25 13:38:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 38, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774445907.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58200.001, raw_value=58200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878459, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 28, 900327, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903274, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903302, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903318, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903340, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903350, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903361, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903371, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903388, tzinfo=datetime.timezone.utc))} (T+58203069 ms) 2026-03-25 13:38:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 37, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774445847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58140.001, raw_value=58140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 28, 900546, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903570, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903609, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903620, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903651, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903676, tzinfo=datetime.timezone.utc))} (T+58203070 ms) 2026-03-25 13:38:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58203071 ms) 2026-03-25 13:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58203071 ms) 2026-03-25 13:38:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 38, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774445907.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58200.001, raw_value=58200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878459, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 28, 900327, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903274, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903302, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903318, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903340, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903350, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903361, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903371, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903388, tzinfo=datetime.timezone.utc))} (T+58203073 ms) 2026-03-25 13:38:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 37, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774445847.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58140.001, raw_value=58140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 27, 878462, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 28, 900546, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903570, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903598, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903609, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903620, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903651, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 37, 30, 903676, tzinfo=datetime.timezone.utc))} (T+58203073 ms) 2026-03-25 13:39:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58263068 ms) 2026-03-25 13:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58263069 ms) 2026-03-25 13:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 39, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445967.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58260.001, raw_value=58260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904201, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904212, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904233, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904253, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904281, tzinfo=datetime.timezone.utc))} (T+58263070 ms) 2026-03-25 13:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 38, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774445907.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58200.001, raw_value=58200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878459, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 28, 900327, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903274, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903302, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903318, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903340, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903350, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903361, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903371, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903388, tzinfo=datetime.timezone.utc))} (T+58263070 ms) 2026-03-25 13:39:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58263071 ms) 2026-03-25 13:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58263071 ms) 2026-03-25 13:39:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 39, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445967.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58260.001, raw_value=58260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904201, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904212, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904233, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904253, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904281, tzinfo=datetime.timezone.utc))} (T+58263072 ms) 2026-03-25 13:39:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 38, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774445907.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58200.001, raw_value=58200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 27, 878459, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 28, 900327, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903274, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903302, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903318, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903340, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903350, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903361, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903371, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 38, 30, 903388, tzinfo=datetime.timezone.utc))} (T+58263073 ms) 2026-03-25 13:40:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58323068 ms) 2026-03-25 13:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58323068 ms) 2026-03-25 13:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 40, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774446027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58320.001, raw_value=58320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 28, 901028, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904040, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904092, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904111, tzinfo=datetime.timezone.utc))} (T+58323070 ms) 2026-03-25 13:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 39, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445967.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58260.001, raw_value=58260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904201, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904212, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904233, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904253, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904281, tzinfo=datetime.timezone.utc))} (T+58323071 ms) 2026-03-25 13:40:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58323072 ms) 2026-03-25 13:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58323072 ms) 2026-03-25 13:40:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 40, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774446027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58320.001, raw_value=58320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 28, 901028, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904040, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904092, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904111, tzinfo=datetime.timezone.utc))} (T+58323076 ms) 2026-03-25 13:40:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 39, 27, 878166, tzinfo=datetime.timezone.utc), raw_value=1774445967.878166, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878275, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58260.001, raw_value=58260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 28, 901232, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904174, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904201, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904212, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904233, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904242, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904253, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 39, 30, 904281, tzinfo=datetime.timezone.utc))} (T+58323076 ms) 2026-03-25 13:41:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58383069 ms) 2026-03-25 13:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58383069 ms) 2026-03-25 13:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 41, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774446087.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878428, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58380.001, raw_value=58380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878982, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 28, 901810, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904765, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904792, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904815, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904888, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904910, tzinfo=datetime.timezone.utc))} (T+58383071 ms) 2026-03-25 13:41:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 40, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774446027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58320.001, raw_value=58320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 28, 901028, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904040, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904092, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904111, tzinfo=datetime.timezone.utc))} (T+58383072 ms) 2026-03-25 13:41:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58383073 ms) 2026-03-25 13:41:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58383073 ms) 2026-03-25 13:41:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 41, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774446087.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878428, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58380.001, raw_value=58380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878982, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 28, 901810, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904765, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904792, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904815, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904888, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904910, tzinfo=datetime.timezone.utc))} (T+58383077 ms) 2026-03-25 13:41:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 40, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774446027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58320.001, raw_value=58320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 28, 901028, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 903999, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904028, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904040, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904092, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 40, 30, 904111, tzinfo=datetime.timezone.utc))} (T+58383078 ms) 2026-03-25 13:42:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58443068 ms) 2026-03-25 13:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58443068 ms) 2026-03-25 13:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 42, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446147.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58440.001, raw_value=58440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 28, 900544, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903994, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904009, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904022, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904078, tzinfo=datetime.timezone.utc))} (T+58443069 ms) 2026-03-25 13:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 41, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774446087.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878428, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58380.001, raw_value=58380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878982, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 28, 901810, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904765, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904792, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904815, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904888, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904910, tzinfo=datetime.timezone.utc))} (T+58443070 ms) 2026-03-25 13:42:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58443070 ms) 2026-03-25 13:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58443071 ms) 2026-03-25 13:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 42, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446147.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58440.001, raw_value=58440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 28, 900544, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903994, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904009, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904022, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904078, tzinfo=datetime.timezone.utc))} (T+58443071 ms) 2026-03-25 13:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 41, 27, 878207, tzinfo=datetime.timezone.utc), raw_value=1774446087.878207, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878428, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58380.001, raw_value=58380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 27, 878982, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 28, 901810, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904765, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904792, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904804, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904815, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904825, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904835, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904846, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904888, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 41, 30, 904910, tzinfo=datetime.timezone.utc))} (T+58443072 ms) 2026-03-25 13:43:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58503068 ms) 2026-03-25 13:43:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58503069 ms) 2026-03-25 13:43:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 43, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774446207.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58500.001, raw_value=58500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 28, 901543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904550, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904571, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904581, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904603, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904616, tzinfo=datetime.timezone.utc))} (T+58503071 ms) 2026-03-25 13:43:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 42, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446147.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58440.001, raw_value=58440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 28, 900544, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903994, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904009, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904022, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904078, tzinfo=datetime.timezone.utc))} (T+58503072 ms) 2026-03-25 13:43:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58503073 ms) 2026-03-25 13:43:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58503073 ms) 2026-03-25 13:43:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 43, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774446207.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58500.001, raw_value=58500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 28, 901543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904550, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904571, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904581, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904603, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904616, tzinfo=datetime.timezone.utc))} (T+58503077 ms) 2026-03-25 13:43:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 42, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446147.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58440.001, raw_value=58440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 27, 878494, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 28, 900544, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903960, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 903994, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904009, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904022, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904032, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904042, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904052, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904062, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 42, 30, 904078, tzinfo=datetime.timezone.utc))} (T+58503078 ms) 2026-03-25 13:44:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58563068 ms) 2026-03-25 13:44:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58563068 ms) 2026-03-25 13:44:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 44, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774446267.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878236, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58560.001, raw_value=58560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 28, 900524, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903542, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903554, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903574, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903584, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903623, tzinfo=datetime.timezone.utc))} (T+58563069 ms) 2026-03-25 13:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 43, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774446207.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58500.001, raw_value=58500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 28, 901543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904550, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904571, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904581, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904603, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904616, tzinfo=datetime.timezone.utc))} (T+58563070 ms) 2026-03-25 13:44:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58563071 ms) 2026-03-25 13:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58563071 ms) 2026-03-25 13:44:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 44, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774446267.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878236, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58560.001, raw_value=58560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 28, 900524, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903542, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903554, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903574, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903584, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903623, tzinfo=datetime.timezone.utc))} (T+58563071 ms) 2026-03-25 13:44:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 43, 27, 878225, tzinfo=datetime.timezone.utc), raw_value=1774446207.878225, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58500.001, raw_value=58500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 28, 901543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904509, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904550, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904560, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904571, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904581, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904593, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904603, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 43, 30, 904616, tzinfo=datetime.timezone.utc))} (T+58563072 ms) 2026-03-25 13:45:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58623068 ms) 2026-03-25 13:45:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58623069 ms) 2026-03-25 13:45:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 45, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774446327.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58620.001, raw_value=58620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 28, 901418, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904357, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904385, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904396, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904415, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904428, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904439, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904449, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904464, tzinfo=datetime.timezone.utc))} (T+58623070 ms) 2026-03-25 13:45:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 44, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774446267.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878236, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58560.001, raw_value=58560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 28, 900524, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903542, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903554, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903574, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903584, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903623, tzinfo=datetime.timezone.utc))} (T+58623072 ms) 2026-03-25 13:45:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58623073 ms) 2026-03-25 13:45:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58623073 ms) 2026-03-25 13:45:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 45, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774446327.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58620.001, raw_value=58620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 28, 901418, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904357, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904385, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904396, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904415, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904428, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904439, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904449, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904464, tzinfo=datetime.timezone.utc))} (T+58623073 ms) 2026-03-25 13:45:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 44, 27, 878129, tzinfo=datetime.timezone.utc), raw_value=1774446267.878129, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878236, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58560.001, raw_value=58560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 27, 878445, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 28, 900524, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903515, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903542, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903554, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903574, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903584, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903599, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 44, 30, 903623, tzinfo=datetime.timezone.utc))} (T+58623074 ms) 2026-03-25 13:46:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58683067 ms) 2026-03-25 13:46:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58683068 ms) 2026-03-25 13:46:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 46, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774446387.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58680.001, raw_value=58680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 28, 900439, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903472, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903498, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903519, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903530, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903540, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903554, tzinfo=datetime.timezone.utc))} (T+58683069 ms) 2026-03-25 13:46:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 45, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774446327.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58620.001, raw_value=58620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 28, 901418, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904357, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904385, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904396, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904415, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904428, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904439, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904449, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904464, tzinfo=datetime.timezone.utc))} (T+58683070 ms) 2026-03-25 13:46:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58683070 ms) 2026-03-25 13:46:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58683071 ms) 2026-03-25 13:46:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 46, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774446387.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58680.001, raw_value=58680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 28, 900439, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903472, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903498, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903519, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903530, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903540, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903554, tzinfo=datetime.timezone.utc))} (T+58683075 ms) 2026-03-25 13:46:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 45, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774446327.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878332, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58620.001, raw_value=58620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 27, 878565, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 28, 901418, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904357, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904385, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904396, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904405, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904415, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904428, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904439, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904449, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 45, 30, 904464, tzinfo=datetime.timezone.utc))} (T+58683075 ms) 2026-03-25 13:47:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58743068 ms) 2026-03-25 13:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58743068 ms) 2026-03-25 13:47:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 47, 27, 878139, tzinfo=datetime.timezone.utc), raw_value=1774446447.878139, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58740.001, raw_value=58740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878450, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 28, 901256, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904253, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904294, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904306, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904315, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904328, tzinfo=datetime.timezone.utc))} (T+58743069 ms) 2026-03-25 13:47:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 46, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774446387.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58680.001, raw_value=58680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 28, 900439, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903472, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903498, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903519, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903530, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903540, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903554, tzinfo=datetime.timezone.utc))} (T+58743070 ms) 2026-03-25 13:47:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58743071 ms) 2026-03-25 13:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58743071 ms) 2026-03-25 13:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 47, 27, 878139, tzinfo=datetime.timezone.utc), raw_value=1774446447.878139, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58740.001, raw_value=58740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878450, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 28, 901256, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904253, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904294, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904306, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904315, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904328, tzinfo=datetime.timezone.utc))} (T+58743071 ms) 2026-03-25 13:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 46, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774446387.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58680.001, raw_value=58680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 27, 878499, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 28, 900439, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903472, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903487, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903498, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903509, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903519, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903530, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903540, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 46, 30, 903554, tzinfo=datetime.timezone.utc))} (T+58743072 ms) 2026-03-25 13:48:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58803067 ms) 2026-03-25 13:48:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58803068 ms) 2026-03-25 13:48:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 48, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446507.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58800.001, raw_value=58800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 28, 900764, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903763, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903790, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903801, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903868, tzinfo=datetime.timezone.utc))} (T+58803070 ms) 2026-03-25 13:48:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 47, 27, 878139, tzinfo=datetime.timezone.utc), raw_value=1774446447.878139, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58740.001, raw_value=58740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878450, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 28, 901256, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904253, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904294, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904306, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904315, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904328, tzinfo=datetime.timezone.utc))} (T+58803071 ms) 2026-03-25 13:48:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58803071 ms) 2026-03-25 13:48:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58803071 ms) 2026-03-25 13:48:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 48, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446507.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58800.001, raw_value=58800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 28, 900764, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903763, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903790, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903801, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903868, tzinfo=datetime.timezone.utc))} (T+58803075 ms) 2026-03-25 13:48:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 47, 27, 878139, tzinfo=datetime.timezone.utc), raw_value=1774446447.878139, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58740.001, raw_value=58740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 27, 878450, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 28, 901256, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904225, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904253, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904264, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904274, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904284, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904294, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904306, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904315, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 47, 30, 904328, tzinfo=datetime.timezone.utc))} (T+58803076 ms) 2026-03-25 13:49:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58863067 ms) 2026-03-25 13:49:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58863068 ms) 2026-03-25 13:49:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 49, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774446567.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58860.001, raw_value=58860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 28, 900597, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903583, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903611, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903622, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903679, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903696, tzinfo=datetime.timezone.utc))} (T+58863069 ms) 2026-03-25 13:49:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 48, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446507.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58800.001, raw_value=58800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 28, 900764, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903763, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903790, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903801, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903868, tzinfo=datetime.timezone.utc))} (T+58863070 ms) 2026-03-25 13:49:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58863070 ms) 2026-03-25 13:49:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58863070 ms) 2026-03-25 13:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 49, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774446567.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58860.001, raw_value=58860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 28, 900597, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903583, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903611, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903622, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903679, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903696, tzinfo=datetime.timezone.utc))} (T+58863071 ms) 2026-03-25 13:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 48, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774446507.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878280, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58800.001, raw_value=58800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 27, 878500, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 28, 900764, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903763, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903790, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903801, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903811, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903821, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903831, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903852, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 48, 30, 903868, tzinfo=datetime.timezone.utc))} (T+58863072 ms) 2026-03-25 13:50:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58923068 ms) 2026-03-25 13:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58923068 ms) 2026-03-25 13:50:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 50, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774446627.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58920.001, raw_value=58920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 28, 900912, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903896, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903911, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903922, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903963, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903979, tzinfo=datetime.timezone.utc))} (T+58923069 ms) 2026-03-25 13:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 49, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774446567.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58860.001, raw_value=58860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 28, 900597, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903583, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903611, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903622, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903679, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903696, tzinfo=datetime.timezone.utc))} (T+58923072 ms) 2026-03-25 13:50:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58923072 ms) 2026-03-25 13:50:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58923072 ms) 2026-03-25 13:50:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 50, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774446627.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58920.001, raw_value=58920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 28, 900912, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903896, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903911, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903922, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903963, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903979, tzinfo=datetime.timezone.utc))} (T+58923077 ms) 2026-03-25 13:50:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 49, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774446567.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58860.001, raw_value=58860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 28, 900597, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903583, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903611, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903622, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903633, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903643, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903653, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903664, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903679, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 49, 30, 903696, tzinfo=datetime.timezone.utc))} (T+58923077 ms) 2026-03-25 13:51:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+58983068 ms) 2026-03-25 13:51:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+58983068 ms) 2026-03-25 13:51:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 51, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774446687.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58980.001, raw_value=58980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903901, tzinfo=datetime.timezone.utc))} (T+58983070 ms) 2026-03-25 13:51:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 50, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774446627.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58920.001, raw_value=58920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 28, 900912, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903896, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903911, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903922, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903963, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903979, tzinfo=datetime.timezone.utc))} (T+58983071 ms) 2026-03-25 13:51:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+58983072 ms) 2026-03-25 13:51:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+58983072 ms) 2026-03-25 13:51:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 51, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774446687.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58980.001, raw_value=58980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903901, tzinfo=datetime.timezone.utc))} (T+58983073 ms) 2026-03-25 13:51:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 50, 27, 878211, tzinfo=datetime.timezone.utc), raw_value=1774446627.878211, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58920.001, raw_value=58920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 27, 878541, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 28, 900912, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903869, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903896, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903911, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903922, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903933, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903954, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903963, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 50, 30, 903979, tzinfo=datetime.timezone.utc))} (T+58983074 ms) 2026-03-25 13:52:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59043068 ms) 2026-03-25 13:52:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59043068 ms) 2026-03-25 13:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 52, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774446747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59040.001, raw_value=59040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 28, 900849, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903856, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903868, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903887, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903908, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903936, tzinfo=datetime.timezone.utc))} (T+59043069 ms) 2026-03-25 13:52:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 51, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774446687.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58980.001, raw_value=58980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903901, tzinfo=datetime.timezone.utc))} (T+59043070 ms) 2026-03-25 13:52:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59043070 ms) 2026-03-25 13:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59043071 ms) 2026-03-25 13:52:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 52, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774446747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59040.001, raw_value=59040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 28, 900849, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903856, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903868, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903887, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903908, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903936, tzinfo=datetime.timezone.utc))} (T+59043072 ms) 2026-03-25 13:52:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 51, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774446687.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878308, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=58980.001, raw_value=58980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 28, 900784, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903819, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903862, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903874, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903883, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 51, 30, 903901, tzinfo=datetime.timezone.utc))} (T+59043072 ms) 2026-03-25 13:53:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59103068 ms) 2026-03-25 13:53:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59103068 ms) 2026-03-25 13:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 53, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774446807.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59100.001, raw_value=59100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903652, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903680, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903692, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903702, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+59103069 ms) 2026-03-25 13:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 52, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774446747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59040.001, raw_value=59040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 28, 900849, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903856, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903868, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903887, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903908, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903936, tzinfo=datetime.timezone.utc))} (T+59103070 ms) 2026-03-25 13:53:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59103071 ms) 2026-03-25 13:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59103071 ms) 2026-03-25 13:53:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 53, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774446807.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59100.001, raw_value=59100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903652, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903680, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903692, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903702, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+59103081 ms) 2026-03-25 13:53:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 52, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774446747.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59040.001, raw_value=59040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 28, 900849, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903829, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903856, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903868, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903887, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903897, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903908, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 52, 30, 903936, tzinfo=datetime.timezone.utc))} (T+59103082 ms) 2026-03-25 13:54:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59163067 ms) 2026-03-25 13:54:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59163068 ms) 2026-03-25 13:54:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 54, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774446867.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59160.001, raw_value=59160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903455, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903497, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903508, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903518, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903528, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903543, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903553, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903569, tzinfo=datetime.timezone.utc))} (T+59163069 ms) 2026-03-25 13:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 53, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774446807.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59100.001, raw_value=59100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903652, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903680, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903692, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903702, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+59163070 ms) 2026-03-25 13:54:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59163070 ms) 2026-03-25 13:54:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59163071 ms) 2026-03-25 13:54:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 54, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774446867.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59160.001, raw_value=59160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903455, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903497, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903508, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903518, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903528, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903543, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903553, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903569, tzinfo=datetime.timezone.utc))} (T+59163072 ms) 2026-03-25 13:54:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 53, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774446807.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59100.001, raw_value=59100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903652, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903680, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903692, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903702, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903721, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903736, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903747, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 53, 30, 903762, tzinfo=datetime.timezone.utc))} (T+59163073 ms) 2026-03-25 13:55:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59223068 ms) 2026-03-25 13:55:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59223069 ms) 2026-03-25 13:55:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 55, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774446927.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59220.001, raw_value=59220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 28, 901732, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904674, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904702, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904714, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904743, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904753, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904763, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904779, tzinfo=datetime.timezone.utc))} (T+59223070 ms) 2026-03-25 13:55:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 54, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774446867.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59160.001, raw_value=59160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903455, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903497, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903508, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903518, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903528, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903543, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903553, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903569, tzinfo=datetime.timezone.utc))} (T+59223071 ms) 2026-03-25 13:55:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59223072 ms) 2026-03-25 13:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59223072 ms) 2026-03-25 13:55:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 55, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774446927.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59220.001, raw_value=59220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 28, 901732, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904674, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904702, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904714, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904743, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904753, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904763, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904779, tzinfo=datetime.timezone.utc))} (T+59223073 ms) 2026-03-25 13:55:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 54, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774446867.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878285, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59160.001, raw_value=59160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 28, 900446, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903455, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903497, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903508, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903518, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903528, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903543, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903553, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 54, 30, 903569, tzinfo=datetime.timezone.utc))} (T+59223074 ms) 2026-03-25 13:56:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59283068 ms) 2026-03-25 13:56:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59283069 ms) 2026-03-25 13:56:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 56, 27, 878136, tzinfo=datetime.timezone.utc), raw_value=1774446987.878136, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59280.001, raw_value=59280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 28, 901143, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904197, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904239, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904255, tzinfo=datetime.timezone.utc))} (T+59283071 ms) 2026-03-25 13:56:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 55, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774446927.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59220.001, raw_value=59220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 28, 901732, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904674, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904702, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904714, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904743, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904753, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904763, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904779, tzinfo=datetime.timezone.utc))} (T+59283071 ms) 2026-03-25 13:56:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59283072 ms) 2026-03-25 13:56:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59283072 ms) 2026-03-25 13:56:30.918 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 56, 27, 878136, tzinfo=datetime.timezone.utc), raw_value=1774446987.878136, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59280.001, raw_value=59280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 28, 901143, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904197, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904239, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904255, tzinfo=datetime.timezone.utc))} (T+59283080 ms) 2026-03-25 13:56:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 55, 27, 878144, tzinfo=datetime.timezone.utc), raw_value=1774446927.878144, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59220.001, raw_value=59220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 27, 878489, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 28, 901732, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904674, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904702, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904714, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904743, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904753, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904763, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 55, 30, 904779, tzinfo=datetime.timezone.utc))} (T+59283080 ms) 2026-03-25 13:57:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59343067 ms) 2026-03-25 13:57:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59343068 ms) 2026-03-25 13:57:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 57, 27, 878107, tzinfo=datetime.timezone.utc), raw_value=1774447047.878107, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878214, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59340.001, raw_value=59340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878424, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 28, 900616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903554, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903581, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903593, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903614, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903635, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903649, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903665, tzinfo=datetime.timezone.utc))} (T+59343069 ms) 2026-03-25 13:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 56, 27, 878136, tzinfo=datetime.timezone.utc), raw_value=1774446987.878136, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59280.001, raw_value=59280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 28, 901143, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904197, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904239, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904255, tzinfo=datetime.timezone.utc))} (T+59343069 ms) 2026-03-25 13:57:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59343070 ms) 2026-03-25 13:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59343070 ms) 2026-03-25 13:57:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 57, 27, 878107, tzinfo=datetime.timezone.utc), raw_value=1774447047.878107, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878214, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59340.001, raw_value=59340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878424, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 28, 900616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903554, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903581, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903593, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903614, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903635, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903649, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903665, tzinfo=datetime.timezone.utc))} (T+59343075 ms) 2026-03-25 13:57:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 56, 27, 878136, tzinfo=datetime.timezone.utc), raw_value=1774446987.878136, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59280.001, raw_value=59280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 27, 878476, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 28, 901143, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904146, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904174, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904186, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904197, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904207, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904217, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904229, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904239, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 56, 30, 904255, tzinfo=datetime.timezone.utc))} (T+59343076 ms) 2026-03-25 13:58:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59403068 ms) 2026-03-25 13:58:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59403068 ms) 2026-03-25 13:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 58, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774447107.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59400.001, raw_value=59400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878544, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 28, 901131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904108, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904123, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904134, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904145, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904158, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904181, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904196, tzinfo=datetime.timezone.utc))} (T+59403069 ms) 2026-03-25 13:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 57, 27, 878107, tzinfo=datetime.timezone.utc), raw_value=1774447047.878107, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878214, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59340.001, raw_value=59340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878424, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 28, 900616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903554, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903581, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903593, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903614, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903635, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903649, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903665, tzinfo=datetime.timezone.utc))} (T+59403070 ms) 2026-03-25 13:58:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59403071 ms) 2026-03-25 13:58:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59403071 ms) 2026-03-25 13:58:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 58, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774447107.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59400.001, raw_value=59400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878544, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 28, 901131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904108, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904123, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904134, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904145, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904158, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904181, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904196, tzinfo=datetime.timezone.utc))} (T+59403080 ms) 2026-03-25 13:58:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 57, 27, 878107, tzinfo=datetime.timezone.utc), raw_value=1774447047.878107, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878214, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59340.001, raw_value=59340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 27, 878424, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 28, 900616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903554, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903581, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903593, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903603, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903614, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903624, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903635, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903649, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 57, 30, 903665, tzinfo=datetime.timezone.utc))} (T+59403081 ms) 2026-03-25 13:59:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59463067 ms) 2026-03-25 13:59:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59463068 ms) 2026-03-25 13:59:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 59, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774447167.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59460.001, raw_value=59460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 28, 900437, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903447, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903458, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903479, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903488, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903500, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903509, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903525, tzinfo=datetime.timezone.utc))} (T+59463068 ms) 2026-03-25 13:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 58, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774447107.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59400.001, raw_value=59400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878544, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 28, 901131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904108, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904123, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904134, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904145, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904158, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904181, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904196, tzinfo=datetime.timezone.utc))} (T+59463069 ms) 2026-03-25 13:59:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59463070 ms) 2026-03-25 13:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59463070 ms) 2026-03-25 13:59:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 59, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774447167.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59460.001, raw_value=59460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 28, 900437, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903447, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903458, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903479, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903488, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903500, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903509, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903525, tzinfo=datetime.timezone.utc))} (T+59463074 ms) 2026-03-25 13:59:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 58, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774447107.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59400.001, raw_value=59400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 27, 878544, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 28, 901131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904081, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904108, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904123, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904134, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904145, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904158, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904171, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904181, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 58, 30, 904196, tzinfo=datetime.timezone.utc))} (T+59463075 ms) 2026-03-25 14:00:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59523067 ms) 2026-03-25 14:00:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59523068 ms) 2026-03-25 14:00:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 0, 27, 878092, tzinfo=datetime.timezone.utc), raw_value=1774447227.878092, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878207, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59520.001, raw_value=59520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878426, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 28, 900760, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903781, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903793, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903833, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903843, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903859, tzinfo=datetime.timezone.utc))} (T+59523069 ms) 2026-03-25 14:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 59, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774447167.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59460.001, raw_value=59460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 28, 900437, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903447, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903458, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903479, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903488, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903500, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903509, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903525, tzinfo=datetime.timezone.utc))} (T+59523070 ms) 2026-03-25 14:00:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59523070 ms) 2026-03-25 14:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59523070 ms) 2026-03-25 14:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 0, 27, 878092, tzinfo=datetime.timezone.utc), raw_value=1774447227.878092, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878207, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59520.001, raw_value=59520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878426, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 28, 900760, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903781, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903793, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903833, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903843, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903859, tzinfo=datetime.timezone.utc))} (T+59523071 ms) 2026-03-25 14:00:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 13, 59, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774447167.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59460.001, raw_value=59460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 28, 900437, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903420, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903447, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903458, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903468, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903479, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903488, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903500, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903509, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 13, 59, 30, 903525, tzinfo=datetime.timezone.utc))} (T+59523072 ms) 2026-03-25 14:01:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59583067 ms) 2026-03-25 14:01:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59583068 ms) 2026-03-25 14:01:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 1, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774447287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59580.001, raw_value=59580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 28, 900481, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903571, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903587, tzinfo=datetime.timezone.utc))} (T+59583069 ms) 2026-03-25 14:01:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 0, 27, 878092, tzinfo=datetime.timezone.utc), raw_value=1774447227.878092, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878207, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59520.001, raw_value=59520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878426, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 28, 900760, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903781, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903793, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903833, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903843, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903859, tzinfo=datetime.timezone.utc))} (T+59583069 ms) 2026-03-25 14:01:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59583070 ms) 2026-03-25 14:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59583071 ms) 2026-03-25 14:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 1, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774447287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59580.001, raw_value=59580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 28, 900481, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903571, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903587, tzinfo=datetime.timezone.utc))} (T+59583071 ms) 2026-03-25 14:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 0, 27, 878092, tzinfo=datetime.timezone.utc), raw_value=1774447227.878092, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878207, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59520.001, raw_value=59520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 27, 878426, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 28, 900760, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903753, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903781, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903793, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903803, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903813, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903822, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903833, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903843, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 0, 30, 903859, tzinfo=datetime.timezone.utc))} (T+59583072 ms) 2026-03-25 14:02:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59643067 ms) 2026-03-25 14:02:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59643068 ms) 2026-03-25 14:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 2, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774447347.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59640.001, raw_value=59640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903429, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903457, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903471, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903482, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903492, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903503, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903524, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903538, tzinfo=datetime.timezone.utc))} (T+59643068 ms) 2026-03-25 14:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 1, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774447287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59580.001, raw_value=59580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 28, 900481, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903571, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903587, tzinfo=datetime.timezone.utc))} (T+59643069 ms) 2026-03-25 14:02:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59643070 ms) 2026-03-25 14:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59643070 ms) 2026-03-25 14:02:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 2, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774447347.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59640.001, raw_value=59640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903429, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903457, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903471, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903482, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903492, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903503, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903524, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903538, tzinfo=datetime.timezone.utc))} (T+59643071 ms) 2026-03-25 14:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 1, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774447287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878287, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59580.001, raw_value=59580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 28, 900481, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903481, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903508, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903520, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903530, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903541, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903551, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903562, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903571, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 1, 30, 903587, tzinfo=datetime.timezone.utc))} (T+59643072 ms) 2026-03-25 14:03:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59703068 ms) 2026-03-25 14:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59703069 ms) 2026-03-25 14:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 3, 27, 878222, tzinfo=datetime.timezone.utc), raw_value=1774447407.878222, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59700.001, raw_value=59700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878586, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 28, 901375, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904374, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904384, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904394, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904406, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904430, tzinfo=datetime.timezone.utc))} (T+59703072 ms) 2026-03-25 14:03:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 2, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774447347.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59640.001, raw_value=59640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903429, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903457, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903471, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903482, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903492, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903503, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903524, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903538, tzinfo=datetime.timezone.utc))} (T+59703073 ms) 2026-03-25 14:03:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59703074 ms) 2026-03-25 14:03:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59703074 ms) 2026-03-25 14:03:30.921 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 3, 27, 878222, tzinfo=datetime.timezone.utc), raw_value=1774447407.878222, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59700.001, raw_value=59700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878586, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 28, 901375, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904374, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904384, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904394, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904406, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904430, tzinfo=datetime.timezone.utc))} (T+59703082 ms) 2026-03-25 14:03:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 2, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774447347.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59640.001, raw_value=59640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 27, 878516, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 28, 900453, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903429, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903457, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903471, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903482, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903492, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903503, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903524, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 2, 30, 903538, tzinfo=datetime.timezone.utc))} (T+59703083 ms) 2026-03-25 14:04:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59763068 ms) 2026-03-25 14:04:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59763068 ms) 2026-03-25 14:04:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 4, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447467.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59760.001, raw_value=59760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903909, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903982, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904021, tzinfo=datetime.timezone.utc))} (T+59763069 ms) 2026-03-25 14:04:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 3, 27, 878222, tzinfo=datetime.timezone.utc), raw_value=1774447407.878222, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59700.001, raw_value=59700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878586, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 28, 901375, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904374, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904384, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904394, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904406, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904430, tzinfo=datetime.timezone.utc))} (T+59763071 ms) 2026-03-25 14:04:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59763072 ms) 2026-03-25 14:04:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59763072 ms) 2026-03-25 14:04:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 4, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447467.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59760.001, raw_value=59760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903909, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903982, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904021, tzinfo=datetime.timezone.utc))} (T+59763077 ms) 2026-03-25 14:04:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 3, 27, 878222, tzinfo=datetime.timezone.utc), raw_value=1774447407.878222, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878346, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59700.001, raw_value=59700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 27, 878586, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 28, 901375, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904322, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904352, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904363, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904374, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904384, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904394, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904406, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904416, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 3, 30, 904430, tzinfo=datetime.timezone.utc))} (T+59763077 ms) 2026-03-25 14:05:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59823067 ms) 2026-03-25 14:05:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59823068 ms) 2026-03-25 14:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 5, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774447527.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59820.001, raw_value=59820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 28, 900310, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903258, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903334, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903346, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903356, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903369, tzinfo=datetime.timezone.utc))} (T+59823069 ms) 2026-03-25 14:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 4, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447467.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59760.001, raw_value=59760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903909, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903982, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904021, tzinfo=datetime.timezone.utc))} (T+59823070 ms) 2026-03-25 14:05:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59823070 ms) 2026-03-25 14:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59823071 ms) 2026-03-25 14:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 5, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774447527.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59820.001, raw_value=59820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 28, 900310, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903258, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903334, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903346, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903356, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903369, tzinfo=datetime.timezone.utc))} (T+59823072 ms) 2026-03-25 14:05:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 4, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447467.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59760.001, raw_value=59760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 28, 900914, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903909, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903937, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903982, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904008, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 4, 30, 904021, tzinfo=datetime.timezone.utc))} (T+59823073 ms) 2026-03-25 14:06:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59883071 ms) 2026-03-25 14:06:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59883071 ms) 2026-03-25 14:06:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 6, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774447587.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59880.001, raw_value=59880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 28, 903943, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906800, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906873, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906885, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906899, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906913, tzinfo=datetime.timezone.utc))} (T+59883072 ms) 2026-03-25 14:06:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 5, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774447527.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59820.001, raw_value=59820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 28, 900310, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903258, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903334, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903346, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903356, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903369, tzinfo=datetime.timezone.utc))} (T+59883073 ms) 2026-03-25 14:06:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59883073 ms) 2026-03-25 14:06:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59883073 ms) 2026-03-25 14:06:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 6, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774447587.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59880.001, raw_value=59880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 28, 903943, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906800, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906873, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906885, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906899, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906913, tzinfo=datetime.timezone.utc))} (T+59883074 ms) 2026-03-25 14:06:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 5, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774447527.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878286, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59820.001, raw_value=59820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 28, 900310, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903258, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903288, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903300, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903310, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903320, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903334, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903346, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903356, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 5, 30, 903369, tzinfo=datetime.timezone.utc))} (T+59883075 ms) 2026-03-25 14:07:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+59943068 ms) 2026-03-25 14:07:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+59943068 ms) 2026-03-25 14:07:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 7, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774447647.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59940.001, raw_value=59940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 28, 901106, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904056, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904103, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904113, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904123, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904133, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904155, tzinfo=datetime.timezone.utc))} (T+59943069 ms) 2026-03-25 14:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 6, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774447587.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59880.001, raw_value=59880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 28, 903943, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906800, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906873, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906885, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906899, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906913, tzinfo=datetime.timezone.utc))} (T+59943070 ms) 2026-03-25 14:07:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+59943071 ms) 2026-03-25 14:07:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+59943071 ms) 2026-03-25 14:07:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 7, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774447647.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59940.001, raw_value=59940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 28, 901106, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904056, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904103, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904113, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904123, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904133, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904155, tzinfo=datetime.timezone.utc))} (T+59943072 ms) 2026-03-25 14:07:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 6, 27, 878213, tzinfo=datetime.timezone.utc), raw_value=1774447587.878213, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878325, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59880.001, raw_value=59880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 28, 903943, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906800, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906826, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906841, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906852, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906862, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906873, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906885, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906899, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 6, 30, 906913, tzinfo=datetime.timezone.utc))} (T+59943072 ms) 2026-03-25 14:08:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60003068 ms) 2026-03-25 14:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60003069 ms) 2026-03-25 14:08:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 8, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774447707.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60000.001, raw_value=60000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878592, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 28, 901583, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904558, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904580, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904590, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904600, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904612, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904622, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904635, tzinfo=datetime.timezone.utc))} (T+60003070 ms) 2026-03-25 14:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 7, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774447647.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59940.001, raw_value=59940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 28, 901106, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904056, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904103, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904113, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904123, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904133, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904155, tzinfo=datetime.timezone.utc))} (T+60003071 ms) 2026-03-25 14:08:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60003071 ms) 2026-03-25 14:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60003071 ms) 2026-03-25 14:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 8, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774447707.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60000.001, raw_value=60000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878592, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 28, 901583, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904558, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904580, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904590, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904600, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904612, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904622, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904635, tzinfo=datetime.timezone.utc))} (T+60003072 ms) 2026-03-25 14:08:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 7, 27, 878134, tzinfo=datetime.timezone.utc), raw_value=1774447647.878134, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=59940.001, raw_value=59940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 28, 901106, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904056, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904103, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904113, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904123, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904133, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904143, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 7, 30, 904155, tzinfo=datetime.timezone.utc))} (T+60003073 ms) 2026-03-25 14:09:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60063068 ms) 2026-03-25 14:09:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60063068 ms) 2026-03-25 14:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 9, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774447767.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878263, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60060.001, raw_value=60060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 28, 900800, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903792, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903820, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903876, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903901, tzinfo=datetime.timezone.utc))} (T+60063069 ms) 2026-03-25 14:09:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 8, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774447707.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60000.001, raw_value=60000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878592, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 28, 901583, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904558, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904580, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904590, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904600, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904612, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904622, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904635, tzinfo=datetime.timezone.utc))} (T+60063070 ms) 2026-03-25 14:09:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60063070 ms) 2026-03-25 14:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60063070 ms) 2026-03-25 14:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 9, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774447767.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878263, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60060.001, raw_value=60060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 28, 900800, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903792, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903820, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903876, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903901, tzinfo=datetime.timezone.utc))} (T+60063071 ms) 2026-03-25 14:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 8, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774447707.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878341, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60000.001, raw_value=60000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 27, 878592, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 28, 901583, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904530, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904558, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904580, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904590, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904600, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904612, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904622, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 8, 30, 904635, tzinfo=datetime.timezone.utc))} (T+60063071 ms) 2026-03-25 14:10:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60123067 ms) 2026-03-25 14:10:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60123068 ms) 2026-03-25 14:10:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 10, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774447827.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60120.001, raw_value=60120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903544, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903571, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903585, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903617, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903632, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903656, tzinfo=datetime.timezone.utc))} (T+60123069 ms) 2026-03-25 14:10:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 9, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774447767.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878263, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60060.001, raw_value=60060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 28, 900800, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903792, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903820, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903876, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903901, tzinfo=datetime.timezone.utc))} (T+60123070 ms) 2026-03-25 14:10:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60123070 ms) 2026-03-25 14:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60123070 ms) 2026-03-25 14:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 10, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774447827.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60120.001, raw_value=60120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903544, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903571, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903585, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903617, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903632, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903656, tzinfo=datetime.timezone.utc))} (T+60123072 ms) 2026-03-25 14:10:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 9, 27, 878146, tzinfo=datetime.timezone.utc), raw_value=1774447767.878146, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878263, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60060.001, raw_value=60060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 27, 878483, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 28, 900800, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903792, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903820, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903831, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903842, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903852, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903876, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 9, 30, 903901, tzinfo=datetime.timezone.utc))} (T+60123072 ms) 2026-03-25 14:11:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60183067 ms) 2026-03-25 14:11:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60183068 ms) 2026-03-25 14:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 11, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774447887.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60180.001, raw_value=60180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 28, 900424, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903417, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903427, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903438, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903448, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903468, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903493, tzinfo=datetime.timezone.utc))} (T+60183070 ms) 2026-03-25 14:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 10, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774447827.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60120.001, raw_value=60120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903544, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903571, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903585, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903617, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903632, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903656, tzinfo=datetime.timezone.utc))} (T+60183071 ms) 2026-03-25 14:11:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60183071 ms) 2026-03-25 14:11:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60183071 ms) 2026-03-25 14:11:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 11, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774447887.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60180.001, raw_value=60180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 28, 900424, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903417, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903427, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903438, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903448, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903468, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903493, tzinfo=datetime.timezone.utc))} (T+60183077 ms) 2026-03-25 14:11:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 10, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774447827.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60120.001, raw_value=60120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903544, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903571, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903585, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903617, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903632, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903643, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 10, 30, 903656, tzinfo=datetime.timezone.utc))} (T+60183078 ms) 2026-03-25 14:12:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60243067 ms) 2026-03-25 14:12:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60243068 ms) 2026-03-25 14:12:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447947.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60240.001, raw_value=60240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903287, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903309, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903319, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903354, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903367, tzinfo=datetime.timezone.utc))} (T+60243069 ms) 2026-03-25 14:12:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 11, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774447887.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60180.001, raw_value=60180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 28, 900424, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903417, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903427, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903438, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903448, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903468, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903493, tzinfo=datetime.timezone.utc))} (T+60243069 ms) 2026-03-25 14:12:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60243070 ms) 2026-03-25 14:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60243070 ms) 2026-03-25 14:12:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447947.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60240.001, raw_value=60240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903287, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903309, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903319, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903354, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903367, tzinfo=datetime.timezone.utc))} (T+60243077 ms) 2026-03-25 14:12:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 11, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774447887.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878297, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60180.001, raw_value=60180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 27, 878515, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 28, 900424, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903388, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903417, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903427, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903438, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903448, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903458, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903468, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903478, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 11, 30, 903493, tzinfo=datetime.timezone.utc))} (T+60243078 ms) 2026-03-25 14:13:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60303067 ms) 2026-03-25 14:13:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60303068 ms) 2026-03-25 14:13:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 13, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774448007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60300.001, raw_value=60300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 28, 900430, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903474, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903517, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903528, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903538, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903551, tzinfo=datetime.timezone.utc))} (T+60303069 ms) 2026-03-25 14:13:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447947.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60240.001, raw_value=60240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903287, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903309, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903319, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903354, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903367, tzinfo=datetime.timezone.utc))} (T+60303069 ms) 2026-03-25 14:13:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60303070 ms) 2026-03-25 14:13:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60303070 ms) 2026-03-25 14:13:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 13, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774448007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60300.001, raw_value=60300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 28, 900430, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903474, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903517, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903528, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903538, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903551, tzinfo=datetime.timezone.utc))} (T+60303076 ms) 2026-03-25 14:13:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 12, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774447947.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60240.001, raw_value=60240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 27, 878495, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903287, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903299, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903309, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903319, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903329, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903344, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903354, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 12, 30, 903367, tzinfo=datetime.timezone.utc))} (T+60303076 ms) 2026-03-25 14:14:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60363067 ms) 2026-03-25 14:14:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60363068 ms) 2026-03-25 14:14:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 14, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774448067.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60360.001, raw_value=60360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903511, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903623, tzinfo=datetime.timezone.utc))} (T+60363069 ms) 2026-03-25 14:14:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 13, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774448007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60300.001, raw_value=60300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 28, 900430, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903474, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903517, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903528, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903538, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903551, tzinfo=datetime.timezone.utc))} (T+60363070 ms) 2026-03-25 14:14:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60363071 ms) 2026-03-25 14:14:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60363071 ms) 2026-03-25 14:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 14, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774448067.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60360.001, raw_value=60360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903511, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903623, tzinfo=datetime.timezone.utc))} (T+60363072 ms) 2026-03-25 14:14:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 13, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774448007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60300.001, raw_value=60300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 28, 900430, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903446, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903474, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903486, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903517, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903528, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903538, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 13, 30, 903551, tzinfo=datetime.timezone.utc))} (T+60363073 ms) 2026-03-25 14:15:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60423067 ms) 2026-03-25 14:15:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60423068 ms) 2026-03-25 14:15:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 15, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774448127.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60420.001, raw_value=60420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903267, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903295, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903317, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903327, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903372, tzinfo=datetime.timezone.utc))} (T+60423068 ms) 2026-03-25 14:15:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 14, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774448067.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60360.001, raw_value=60360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903511, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903623, tzinfo=datetime.timezone.utc))} (T+60423069 ms) 2026-03-25 14:15:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60423070 ms) 2026-03-25 14:15:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60423070 ms) 2026-03-25 14:15:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 15, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774448127.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60420.001, raw_value=60420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903267, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903295, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903317, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903327, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903372, tzinfo=datetime.timezone.utc))} (T+60423071 ms) 2026-03-25 14:15:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 14, 27, 878155, tzinfo=datetime.timezone.utc), raw_value=1774448067.878155, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878261, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60360.001, raw_value=60360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 27, 878471, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 28, 900514, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903511, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903539, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903553, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903564, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903573, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903587, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903600, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903610, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 14, 30, 903623, tzinfo=datetime.timezone.utc))} (T+60423071 ms) 2026-03-25 14:16:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60483068 ms) 2026-03-25 14:16:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60483069 ms) 2026-03-25 14:16:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 16, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774448187.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878362, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60480.001, raw_value=60480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878609, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 28, 901671, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904593, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904619, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904641, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904673, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904684, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904699, tzinfo=datetime.timezone.utc))} (T+60483070 ms) 2026-03-25 14:16:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 15, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774448127.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60420.001, raw_value=60420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903267, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903295, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903317, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903327, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903372, tzinfo=datetime.timezone.utc))} (T+60483070 ms) 2026-03-25 14:16:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60483071 ms) 2026-03-25 14:16:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60483071 ms) 2026-03-25 14:16:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 16, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774448187.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878362, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60480.001, raw_value=60480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878609, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 28, 901671, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904593, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904619, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904641, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904673, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904684, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904699, tzinfo=datetime.timezone.utc))} (T+60483072 ms) 2026-03-25 14:16:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 15, 27, 878157, tzinfo=datetime.timezone.utc), raw_value=1774448127.878157, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878272, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60420.001, raw_value=60420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 28, 900315, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903267, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903295, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903306, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903317, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903327, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903337, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903348, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903358, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 15, 30, 903372, tzinfo=datetime.timezone.utc))} (T+60483072 ms) 2026-03-25 14:17:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60543067 ms) 2026-03-25 14:17:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60543068 ms) 2026-03-25 14:17:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 17, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448247.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60540.001, raw_value=60540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 28, 900539, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903538, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903588, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903643, tzinfo=datetime.timezone.utc))} (T+60543068 ms) 2026-03-25 14:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 16, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774448187.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878362, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60480.001, raw_value=60480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878609, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 28, 901671, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904593, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904619, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904641, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904673, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904684, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904699, tzinfo=datetime.timezone.utc))} (T+60543069 ms) 2026-03-25 14:17:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60543070 ms) 2026-03-25 14:17:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60543070 ms) 2026-03-25 14:17:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 17, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448247.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60540.001, raw_value=60540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 28, 900539, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903538, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903588, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903643, tzinfo=datetime.timezone.utc))} (T+60543071 ms) 2026-03-25 14:17:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 16, 27, 878227, tzinfo=datetime.timezone.utc), raw_value=1774448187.878227, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878362, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60480.001, raw_value=60480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 27, 878609, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 28, 901671, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904593, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904619, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904631, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904641, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904652, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904662, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904673, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904684, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 16, 30, 904699, tzinfo=datetime.timezone.utc))} (T+60543071 ms) 2026-03-25 14:18:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60603068 ms) 2026-03-25 14:18:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60603068 ms) 2026-03-25 14:18:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 18, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448307.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60600.001, raw_value=60600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 28, 900598, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903615, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903700, tzinfo=datetime.timezone.utc))} (T+60603069 ms) 2026-03-25 14:18:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 17, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448247.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60540.001, raw_value=60540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 28, 900539, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903538, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903588, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903643, tzinfo=datetime.timezone.utc))} (T+60603070 ms) 2026-03-25 14:18:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60603071 ms) 2026-03-25 14:18:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60603071 ms) 2026-03-25 14:18:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 18, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448307.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60600.001, raw_value=60600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 28, 900598, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903615, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903700, tzinfo=datetime.timezone.utc))} (T+60603071 ms) 2026-03-25 14:18:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 17, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448247.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60540.001, raw_value=60540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 28, 900539, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903538, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903566, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903578, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903588, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903598, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903608, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903619, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903630, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 17, 30, 903643, tzinfo=datetime.timezone.utc))} (T+60603072 ms) 2026-03-25 14:19:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60663068 ms) 2026-03-25 14:19:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60663068 ms) 2026-03-25 14:19:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 19, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774448367.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60660.001, raw_value=60660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903726, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903836, tzinfo=datetime.timezone.utc))} (T+60663069 ms) 2026-03-25 14:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 18, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448307.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60600.001, raw_value=60600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 28, 900598, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903615, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903700, tzinfo=datetime.timezone.utc))} (T+60663070 ms) 2026-03-25 14:19:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60663071 ms) 2026-03-25 14:19:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60663071 ms) 2026-03-25 14:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 19, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774448367.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60660.001, raw_value=60660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903726, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903836, tzinfo=datetime.timezone.utc))} (T+60663071 ms) 2026-03-25 14:19:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 18, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774448307.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878306, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60600.001, raw_value=60600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 28, 900598, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903615, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903665, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903687, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 18, 30, 903700, tzinfo=datetime.timezone.utc))} (T+60663072 ms) 2026-03-25 14:20:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60723068 ms) 2026-03-25 14:20:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60723068 ms) 2026-03-25 14:20:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 20, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774448427.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60720.001, raw_value=60720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903682, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903693, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903703, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903754, tzinfo=datetime.timezone.utc))} (T+60723069 ms) 2026-03-25 14:20:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 19, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774448367.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60660.001, raw_value=60660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903726, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903836, tzinfo=datetime.timezone.utc))} (T+60723070 ms) 2026-03-25 14:20:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60723071 ms) 2026-03-25 14:20:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60723071 ms) 2026-03-25 14:20:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 20, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774448427.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60720.001, raw_value=60720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903682, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903693, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903703, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903754, tzinfo=datetime.timezone.utc))} (T+60723072 ms) 2026-03-25 14:20:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 19, 27, 878179, tzinfo=datetime.timezone.utc), raw_value=1774448367.878179, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60660.001, raw_value=60660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 28, 900748, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903726, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903754, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903766, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903776, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903786, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903797, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903807, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903818, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 19, 30, 903836, tzinfo=datetime.timezone.utc))} (T+60723072 ms) 2026-03-25 14:21:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60783068 ms) 2026-03-25 14:21:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60783069 ms) 2026-03-25 14:21:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 21, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774448487.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60780.001, raw_value=60780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878540, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 28, 901198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904240, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904254, tzinfo=datetime.timezone.utc))} (T+60783070 ms) 2026-03-25 14:21:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 20, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774448427.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60720.001, raw_value=60720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903682, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903693, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903703, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903754, tzinfo=datetime.timezone.utc))} (T+60783071 ms) 2026-03-25 14:21:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60783071 ms) 2026-03-25 14:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60783072 ms) 2026-03-25 14:21:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 21, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774448487.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60780.001, raw_value=60780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878540, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 28, 901198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904240, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904254, tzinfo=datetime.timezone.utc))} (T+60783073 ms) 2026-03-25 14:21:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 20, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774448427.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60720.001, raw_value=60720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 28, 900621, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903642, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903671, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903682, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903693, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903703, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903723, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903737, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 20, 30, 903754, tzinfo=datetime.timezone.utc))} (T+60783074 ms) 2026-03-25 14:22:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60843070 ms) 2026-03-25 14:22:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60843071 ms) 2026-03-25 14:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 22, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774448547.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60840.001, raw_value=60840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 28, 903701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906720, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906732, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906752, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906763, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906773, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906787, tzinfo=datetime.timezone.utc))} (T+60843072 ms) 2026-03-25 14:22:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 21, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774448487.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60780.001, raw_value=60780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878540, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 28, 901198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904240, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904254, tzinfo=datetime.timezone.utc))} (T+60843072 ms) 2026-03-25 14:22:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60843073 ms) 2026-03-25 14:22:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60843073 ms) 2026-03-25 14:22:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 22, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774448547.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60840.001, raw_value=60840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 28, 903701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906720, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906732, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906752, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906763, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906773, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906787, tzinfo=datetime.timezone.utc))} (T+60843074 ms) 2026-03-25 14:22:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 21, 27, 878218, tzinfo=datetime.timezone.utc), raw_value=1774448487.878218, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878331, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60780.001, raw_value=60780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 27, 878540, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 28, 901198, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904178, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904209, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904240, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 21, 30, 904254, tzinfo=datetime.timezone.utc))} (T+60843074 ms) 2026-03-25 14:23:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60903068 ms) 2026-03-25 14:23:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60903068 ms) 2026-03-25 14:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 23, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774448607.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60900.001, raw_value=60900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 28, 900459, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903523, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903565, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903575, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903608, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903637, tzinfo=datetime.timezone.utc))} (T+60903070 ms) 2026-03-25 14:23:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 22, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774448547.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60840.001, raw_value=60840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 28, 903701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906720, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906732, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906752, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906763, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906773, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906787, tzinfo=datetime.timezone.utc))} (T+60903071 ms) 2026-03-25 14:23:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60903072 ms) 2026-03-25 14:23:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60903072 ms) 2026-03-25 14:23:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 23, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774448607.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60900.001, raw_value=60900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 28, 900459, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903523, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903565, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903575, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903608, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903637, tzinfo=datetime.timezone.utc))} (T+60903073 ms) 2026-03-25 14:23:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 22, 27, 878208, tzinfo=datetime.timezone.utc), raw_value=1774448547.878208, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878318, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60840.001, raw_value=60840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 28, 903701, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906678, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906706, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906720, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906732, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906742, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906752, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906763, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906773, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 22, 30, 906787, tzinfo=datetime.timezone.utc))} (T+60903073 ms) 2026-03-25 14:24:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+60963068 ms) 2026-03-25 14:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+60963068 ms) 2026-03-25 14:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 24, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774448667.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60960.001, raw_value=60960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 28, 900470, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903701, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903713, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903756, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903766, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903783, tzinfo=datetime.timezone.utc))} (T+60963069 ms) 2026-03-25 14:24:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 23, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774448607.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60900.001, raw_value=60900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 28, 900459, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903523, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903565, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903575, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903608, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903637, tzinfo=datetime.timezone.utc))} (T+60963069 ms) 2026-03-25 14:24:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+60963070 ms) 2026-03-25 14:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+60963070 ms) 2026-03-25 14:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 24, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774448667.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60960.001, raw_value=60960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 28, 900470, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903701, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903713, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903756, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903766, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903783, tzinfo=datetime.timezone.utc))} (T+60963071 ms) 2026-03-25 14:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 23, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774448607.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60900.001, raw_value=60900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 28, 900459, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903523, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903553, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903565, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903575, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903597, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903608, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903618, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 23, 30, 903637, tzinfo=datetime.timezone.utc))} (T+60963072 ms) 2026-03-25 14:25:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61023068 ms) 2026-03-25 14:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61023069 ms) 2026-03-25 14:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 25, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774448727.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61020.001, raw_value=61020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 28, 901324, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904277, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904305, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904316, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904326, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904347, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904368, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904381, tzinfo=datetime.timezone.utc))} (T+61023069 ms) 2026-03-25 14:25:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 24, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774448667.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60960.001, raw_value=60960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 28, 900470, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903701, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903713, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903756, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903766, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903783, tzinfo=datetime.timezone.utc))} (T+61023070 ms) 2026-03-25 14:25:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61023070 ms) 2026-03-25 14:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61023071 ms) 2026-03-25 14:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 25, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774448727.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61020.001, raw_value=61020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 28, 901324, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904277, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904305, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904316, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904326, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904347, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904368, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904381, tzinfo=datetime.timezone.utc))} (T+61023071 ms) 2026-03-25 14:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 24, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774448667.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=60960.001, raw_value=60960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 27, 878482, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 28, 900470, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903660, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903701, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903713, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903734, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903744, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903756, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903766, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 24, 30, 903783, tzinfo=datetime.timezone.utc))} (T+61023072 ms) 2026-03-25 14:26:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61083068 ms) 2026-03-25 14:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61083069 ms) 2026-03-25 14:26:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 26, 27, 878231, tzinfo=datetime.timezone.utc), raw_value=1774448787.878231, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61080.001, raw_value=61080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878591, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904614, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904661, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904671, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904681, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904697, tzinfo=datetime.timezone.utc))} (T+61083070 ms) 2026-03-25 14:26:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 25, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774448727.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61020.001, raw_value=61020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 28, 901324, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904277, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904305, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904316, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904326, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904347, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904368, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904381, tzinfo=datetime.timezone.utc))} (T+61083071 ms) 2026-03-25 14:26:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61083071 ms) 2026-03-25 14:26:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61083071 ms) 2026-03-25 14:26:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 26, 27, 878231, tzinfo=datetime.timezone.utc), raw_value=1774448787.878231, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61080.001, raw_value=61080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878591, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904614, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904661, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904671, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904681, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904697, tzinfo=datetime.timezone.utc))} (T+61083072 ms) 2026-03-25 14:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 25, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774448727.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61020.001, raw_value=61020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 28, 901324, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904277, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904305, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904316, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904326, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904337, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904347, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904358, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904368, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 25, 30, 904381, tzinfo=datetime.timezone.utc))} (T+61083072 ms) 2026-03-25 14:27:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61143068 ms) 2026-03-25 14:27:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61143068 ms) 2026-03-25 14:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 27, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774448847.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61140.001, raw_value=61140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 28, 900821, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903823, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903851, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903863, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903873, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903935, tzinfo=datetime.timezone.utc))} (T+61143071 ms) 2026-03-25 14:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 26, 27, 878231, tzinfo=datetime.timezone.utc), raw_value=1774448787.878231, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61080.001, raw_value=61080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878591, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904614, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904661, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904671, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904681, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904697, tzinfo=datetime.timezone.utc))} (T+61143072 ms) 2026-03-25 14:27:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61143073 ms) 2026-03-25 14:27:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61143073 ms) 2026-03-25 14:27:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 27, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774448847.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61140.001, raw_value=61140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 28, 900821, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903823, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903851, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903863, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903873, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903935, tzinfo=datetime.timezone.utc))} (T+61143076 ms) 2026-03-25 14:27:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 26, 27, 878231, tzinfo=datetime.timezone.utc), raw_value=1774448787.878231, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61080.001, raw_value=61080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 27, 878591, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 28, 901518, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904587, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904614, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904629, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904640, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904651, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904661, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904671, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904681, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 26, 30, 904697, tzinfo=datetime.timezone.utc))} (T+61143076 ms) 2026-03-25 14:28:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61203070 ms) 2026-03-25 14:28:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61203070 ms) 2026-03-25 14:28:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 28, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774448907.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61200.001, raw_value=61200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 28, 900745, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 903975, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904026, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904088, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904106, tzinfo=datetime.timezone.utc))} (T+61203072 ms) 2026-03-25 14:28:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 27, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774448847.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61140.001, raw_value=61140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 28, 900821, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903823, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903851, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903863, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903873, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903935, tzinfo=datetime.timezone.utc))} (T+61203074 ms) 2026-03-25 14:28:30.913 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61203075 ms) 2026-03-25 14:28:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61203075 ms) 2026-03-25 14:28:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 28, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774448907.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61200.001, raw_value=61200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 28, 900745, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 903975, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904026, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904088, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904106, tzinfo=datetime.timezone.utc))} (T+61203078 ms) 2026-03-25 14:28:30.918 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 27, 27, 878199, tzinfo=datetime.timezone.utc), raw_value=1774448847.878199, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878316, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61140.001, raw_value=61140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 27, 878542, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 28, 900821, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903823, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903851, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903863, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903873, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903893, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903918, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 27, 30, 903935, tzinfo=datetime.timezone.utc))} (T+61203079 ms) 2026-03-25 14:29:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61263068 ms) 2026-03-25 14:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61263069 ms) 2026-03-25 14:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 29, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774448967.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61260.001, raw_value=61260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 28, 901139, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904156, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904215, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904261, tzinfo=datetime.timezone.utc))} (T+61263072 ms) 2026-03-25 14:29:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 28, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774448907.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61200.001, raw_value=61200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 28, 900745, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 903975, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904026, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904088, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904106, tzinfo=datetime.timezone.utc))} (T+61263072 ms) 2026-03-25 14:29:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61263073 ms) 2026-03-25 14:29:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61263073 ms) 2026-03-25 14:29:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 29, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774448967.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61260.001, raw_value=61260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 28, 901139, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904156, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904215, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904261, tzinfo=datetime.timezone.utc))} (T+61263081 ms) 2026-03-25 14:29:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 28, 27, 878195, tzinfo=datetime.timezone.utc), raw_value=1774448907.878195, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61200.001, raw_value=61200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 27, 878527, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 28, 900745, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 903975, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904012, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904026, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904037, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904077, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904088, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 28, 30, 904106, tzinfo=datetime.timezone.utc))} (T+61263082 ms) 2026-03-25 14:30:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61323067 ms) 2026-03-25 14:30:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61323068 ms) 2026-03-25 14:30:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 30, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774449027.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61320.001, raw_value=61320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 28, 900431, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903532, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903560, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903631, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903647, tzinfo=datetime.timezone.utc))} (T+61323069 ms) 2026-03-25 14:30:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 29, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774448967.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61260.001, raw_value=61260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 28, 901139, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904156, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904215, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904261, tzinfo=datetime.timezone.utc))} (T+61323070 ms) 2026-03-25 14:30:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61323070 ms) 2026-03-25 14:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61323071 ms) 2026-03-25 14:30:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 30, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774449027.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61320.001, raw_value=61320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 28, 900431, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903532, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903560, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903631, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903647, tzinfo=datetime.timezone.utc))} (T+61323078 ms) 2026-03-25 14:30:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 29, 27, 878183, tzinfo=datetime.timezone.utc), raw_value=1774448967.878183, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61260.001, raw_value=61260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 28, 901139, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904156, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904183, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904195, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904205, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904215, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904226, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904237, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904247, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 29, 30, 904261, tzinfo=datetime.timezone.utc))} (T+61323079 ms) 2026-03-25 14:31:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61383068 ms) 2026-03-25 14:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61383068 ms) 2026-03-25 14:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774449087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61380.001, raw_value=61380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903891, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903920, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903933, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903954, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903989, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 904002, tzinfo=datetime.timezone.utc))} (T+61383069 ms) 2026-03-25 14:31:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 30, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774449027.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61320.001, raw_value=61320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 28, 900431, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903532, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903560, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903631, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903647, tzinfo=datetime.timezone.utc))} (T+61383070 ms) 2026-03-25 14:31:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61383070 ms) 2026-03-25 14:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61383071 ms) 2026-03-25 14:31:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774449087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61380.001, raw_value=61380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903891, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903920, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903933, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903954, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903989, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 904002, tzinfo=datetime.timezone.utc))} (T+61383071 ms) 2026-03-25 14:31:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 30, 27, 878177, tzinfo=datetime.timezone.utc), raw_value=1774449027.878177, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878292, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61320.001, raw_value=61320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 27, 878508, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 28, 900431, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903532, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903560, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903586, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903606, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903631, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 30, 30, 903647, tzinfo=datetime.timezone.utc))} (T+61383075 ms) 2026-03-25 14:32:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61443069 ms) 2026-03-25 14:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61443069 ms) 2026-03-25 14:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 32, 27, 878404, tzinfo=datetime.timezone.utc), raw_value=1774449147.878404, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878588, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61440.001, raw_value=61440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878824, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 28, 902131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905118, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905145, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905156, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905166, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905177, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905190, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905203, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905213, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905226, tzinfo=datetime.timezone.utc))} (T+61443070 ms) 2026-03-25 14:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774449087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61380.001, raw_value=61380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903891, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903920, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903933, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903954, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903989, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 904002, tzinfo=datetime.timezone.utc))} (T+61443071 ms) 2026-03-25 14:32:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61443072 ms) 2026-03-25 14:32:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61443072 ms) 2026-03-25 14:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 32, 27, 878404, tzinfo=datetime.timezone.utc), raw_value=1774449147.878404, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878588, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61440.001, raw_value=61440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878824, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 28, 902131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905118, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905145, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905156, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905166, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905177, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905190, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905203, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905213, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905226, tzinfo=datetime.timezone.utc))} (T+61443072 ms) 2026-03-25 14:32:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 31, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774449087.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61380.001, raw_value=61380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 28, 900806, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903891, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903920, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903933, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903943, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903954, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903963, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903978, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 903989, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 31, 30, 904002, tzinfo=datetime.timezone.utc))} (T+61443073 ms) 2026-03-25 14:33:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61503067 ms) 2026-03-25 14:33:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61503068 ms) 2026-03-25 14:33:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774449207.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61500.001, raw_value=61500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903720, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903747, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903758, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903789, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903830, tzinfo=datetime.timezone.utc))} (T+61503069 ms) 2026-03-25 14:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 32, 27, 878404, tzinfo=datetime.timezone.utc), raw_value=1774449147.878404, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878588, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61440.001, raw_value=61440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878824, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 28, 902131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905118, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905145, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905156, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905166, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905177, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905190, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905203, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905213, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905226, tzinfo=datetime.timezone.utc))} (T+61503070 ms) 2026-03-25 14:33:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61503070 ms) 2026-03-25 14:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61503071 ms) 2026-03-25 14:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774449207.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61500.001, raw_value=61500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903720, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903747, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903758, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903789, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903830, tzinfo=datetime.timezone.utc))} (T+61503071 ms) 2026-03-25 14:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 32, 27, 878404, tzinfo=datetime.timezone.utc), raw_value=1774449147.878404, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878588, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61440.001, raw_value=61440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 27, 878824, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 28, 902131, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905118, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905145, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905156, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905166, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905177, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905190, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905203, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905213, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 32, 30, 905226, tzinfo=datetime.timezone.utc))} (T+61503072 ms) 2026-03-25 14:34:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61563067 ms) 2026-03-25 14:34:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61563068 ms) 2026-03-25 14:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 34, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774449267.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61560.001, raw_value=61560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 28, 900620, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903602, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903628, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903643, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903654, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903674, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903685, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903712, tzinfo=datetime.timezone.utc))} (T+61563069 ms) 2026-03-25 14:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774449207.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61500.001, raw_value=61500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903720, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903747, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903758, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903789, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903830, tzinfo=datetime.timezone.utc))} (T+61563070 ms) 2026-03-25 14:34:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61563070 ms) 2026-03-25 14:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61563070 ms) 2026-03-25 14:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 34, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774449267.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61560.001, raw_value=61560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 28, 900620, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903602, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903628, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903643, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903654, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903674, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903685, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903712, tzinfo=datetime.timezone.utc))} (T+61563071 ms) 2026-03-25 14:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 33, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774449207.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61500.001, raw_value=61500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 28, 900700, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903720, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903747, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903758, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903769, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903779, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903789, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903804, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903815, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 33, 30, 903830, tzinfo=datetime.timezone.utc))} (T+61563072 ms) 2026-03-25 14:35:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61623069 ms) 2026-03-25 14:35:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61623069 ms) 2026-03-25 14:35:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 35, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774449327.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61620.001, raw_value=61620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 28, 902879, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905342, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905369, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905381, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905390, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905401, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905411, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905444, tzinfo=datetime.timezone.utc))} (T+61623071 ms) 2026-03-25 14:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 34, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774449267.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61560.001, raw_value=61560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 28, 900620, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903602, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903628, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903643, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903654, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903674, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903685, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903712, tzinfo=datetime.timezone.utc))} (T+61623072 ms) 2026-03-25 14:35:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61623072 ms) 2026-03-25 14:35:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61623072 ms) 2026-03-25 14:35:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 35, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774449327.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61620.001, raw_value=61620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 28, 902879, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905342, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905369, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905381, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905390, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905401, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905411, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905444, tzinfo=datetime.timezone.utc))} (T+61623074 ms) 2026-03-25 14:35:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 34, 27, 878186, tzinfo=datetime.timezone.utc), raw_value=1774449267.878186, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61560.001, raw_value=61560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 28, 900620, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903602, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903628, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903643, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903654, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903664, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903674, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903685, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903698, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 34, 30, 903712, tzinfo=datetime.timezone.utc))} (T+61623075 ms) 2026-03-25 14:36:30.903 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61683065 ms) 2026-03-25 14:36:30.904 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61683065 ms) 2026-03-25 14:36:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 36, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774449387.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61680.001, raw_value=61680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 28, 900272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901344, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901354, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901364, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901374, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901386, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901395, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901411, tzinfo=datetime.timezone.utc))} (T+61683067 ms) 2026-03-25 14:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 35, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774449327.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61620.001, raw_value=61620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 28, 902879, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905342, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905369, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905381, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905390, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905401, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905411, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905444, tzinfo=datetime.timezone.utc))} (T+61683068 ms) 2026-03-25 14:36:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61683069 ms) 2026-03-25 14:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61683069 ms) 2026-03-25 14:36:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 36, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774449387.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61680.001, raw_value=61680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 28, 900272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901344, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901354, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901364, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901374, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901386, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901395, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901411, tzinfo=datetime.timezone.utc))} (T+61683073 ms) 2026-03-25 14:36:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 35, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774449327.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61620.001, raw_value=61620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 27, 878513, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 28, 902879, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905342, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905369, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905381, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905390, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905401, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905411, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 35, 30, 905444, tzinfo=datetime.timezone.utc))} (T+61683073 ms) 2026-03-25 14:37:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61743069 ms) 2026-03-25 14:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61743070 ms) 2026-03-25 14:37:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 37, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774449447.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61740.001, raw_value=61740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 28, 902636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905351, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905382, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905393, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905414, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905424, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905435, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905445, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905461, tzinfo=datetime.timezone.utc))} (T+61743071 ms) 2026-03-25 14:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 36, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774449387.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61680.001, raw_value=61680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 28, 900272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901344, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901354, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901364, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901374, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901386, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901395, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901411, tzinfo=datetime.timezone.utc))} (T+61743072 ms) 2026-03-25 14:37:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61743072 ms) 2026-03-25 14:37:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61743072 ms) 2026-03-25 14:37:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 37, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774449447.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61740.001, raw_value=61740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 28, 902636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905351, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905382, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905393, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905414, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905424, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905435, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905445, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905461, tzinfo=datetime.timezone.utc))} (T+61743074 ms) 2026-03-25 14:37:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 36, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774449387.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878252, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61680.001, raw_value=61680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 28, 900272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901305, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901333, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901344, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901354, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901364, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901374, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901386, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901395, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 36, 30, 901411, tzinfo=datetime.timezone.utc))} (T+61743075 ms) 2026-03-25 14:38:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61803069 ms) 2026-03-25 14:38:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61803070 ms) 2026-03-25 14:38:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 38, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774449507.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61800.001, raw_value=61800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 28, 902927, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905336, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905364, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905447, tzinfo=datetime.timezone.utc))} (T+61803071 ms) 2026-03-25 14:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 37, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774449447.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61740.001, raw_value=61740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 28, 902636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905351, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905382, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905393, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905414, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905424, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905435, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905445, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905461, tzinfo=datetime.timezone.utc))} (T+61803071 ms) 2026-03-25 14:38:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61803072 ms) 2026-03-25 14:38:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61803072 ms) 2026-03-25 14:38:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 38, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774449507.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61800.001, raw_value=61800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 28, 902927, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905336, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905364, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905447, tzinfo=datetime.timezone.utc))} (T+61803073 ms) 2026-03-25 14:38:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 37, 27, 878162, tzinfo=datetime.timezone.utc), raw_value=1774449447.878162, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878268, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61740.001, raw_value=61740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 27, 878474, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 28, 902636, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905351, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905382, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905393, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905404, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905414, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905424, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905435, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905445, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 37, 30, 905461, tzinfo=datetime.timezone.utc))} (T+61803074 ms) 2026-03-25 14:39:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61863068 ms) 2026-03-25 14:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61863068 ms) 2026-03-25 14:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 39, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774449567.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61860.001, raw_value=61860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904011, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904044, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904056, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904067, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904110, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904129, tzinfo=datetime.timezone.utc))} (T+61863070 ms) 2026-03-25 14:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 38, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774449507.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61800.001, raw_value=61800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 28, 902927, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905336, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905364, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905447, tzinfo=datetime.timezone.utc))} (T+61863071 ms) 2026-03-25 14:39:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61863071 ms) 2026-03-25 14:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61863071 ms) 2026-03-25 14:39:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 39, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774449567.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61860.001, raw_value=61860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904011, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904044, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904056, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904067, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904110, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904129, tzinfo=datetime.timezone.utc))} (T+61863073 ms) 2026-03-25 14:39:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 38, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774449507.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878293, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61800.001, raw_value=61800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 28, 902927, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905336, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905364, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905378, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905389, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905400, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905409, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905421, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 38, 30, 905447, tzinfo=datetime.timezone.utc))} (T+61863073 ms) 2026-03-25 14:40:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61923069 ms) 2026-03-25 14:40:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61923070 ms) 2026-03-25 14:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 40, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774449627.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61920.001, raw_value=61920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 28, 902866, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905349, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905378, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905389, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905457, tzinfo=datetime.timezone.utc))} (T+61923071 ms) 2026-03-25 14:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 39, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774449567.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61860.001, raw_value=61860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904011, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904044, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904056, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904067, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904110, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904129, tzinfo=datetime.timezone.utc))} (T+61923072 ms) 2026-03-25 14:40:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61923072 ms) 2026-03-25 14:40:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61923073 ms) 2026-03-25 14:40:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 40, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774449627.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61920.001, raw_value=61920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 28, 902866, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905349, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905378, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905389, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905457, tzinfo=datetime.timezone.utc))} (T+61923074 ms) 2026-03-25 14:40:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 39, 27, 878202, tzinfo=datetime.timezone.utc), raw_value=1774449567.878202, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61860.001, raw_value=61860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 27, 878523, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 28, 901004, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904011, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904044, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904056, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904067, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904078, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904088, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904099, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904110, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 39, 30, 904129, tzinfo=datetime.timezone.utc))} (T+61923075 ms) 2026-03-25 14:41:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+61983068 ms) 2026-03-25 14:41:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+61983068 ms) 2026-03-25 14:41:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774449687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61980.001, raw_value=61980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903938, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903990, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904019, tzinfo=datetime.timezone.utc))} (T+61983069 ms) 2026-03-25 14:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 40, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774449627.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61920.001, raw_value=61920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 28, 902866, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905349, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905378, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905389, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905457, tzinfo=datetime.timezone.utc))} (T+61983070 ms) 2026-03-25 14:41:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+61983071 ms) 2026-03-25 14:41:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+61983071 ms) 2026-03-25 14:41:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774449687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61980.001, raw_value=61980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903938, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903990, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904019, tzinfo=datetime.timezone.utc))} (T+61983072 ms) 2026-03-25 14:41:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 40, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774449627.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61920.001, raw_value=61920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 27, 878488, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 28, 902866, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905349, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905378, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905389, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905399, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905410, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905420, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905431, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905441, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 40, 30, 905457, tzinfo=datetime.timezone.utc))} (T+61983072 ms) 2026-03-25 14:42:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62043067 ms) 2026-03-25 14:42:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62043068 ms) 2026-03-25 14:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 42, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774449747.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62040.001, raw_value=62040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903458, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903500, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903521, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903531, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903555, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903569, tzinfo=datetime.timezone.utc))} (T+62043068 ms) 2026-03-25 14:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774449687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61980.001, raw_value=61980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903938, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903990, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904019, tzinfo=datetime.timezone.utc))} (T+62043069 ms) 2026-03-25 14:42:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62043070 ms) 2026-03-25 14:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62043070 ms) 2026-03-25 14:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 42, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774449747.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62040.001, raw_value=62040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903458, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903500, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903521, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903531, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903555, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903569, tzinfo=datetime.timezone.utc))} (T+62043070 ms) 2026-03-25 14:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 41, 27, 878206, tzinfo=datetime.timezone.utc), raw_value=1774449687.878206, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=61980.001, raw_value=61980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903908, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903938, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903949, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903959, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903969, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 903990, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904000, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 41, 30, 904019, tzinfo=datetime.timezone.utc))} (T+62043071 ms) 2026-03-25 14:43:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62103067 ms) 2026-03-25 14:43:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62103068 ms) 2026-03-25 14:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 43, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774449807.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878335, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62100.001, raw_value=62100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 28, 900647, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903692, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903768, tzinfo=datetime.timezone.utc))} (T+62103069 ms) 2026-03-25 14:43:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 42, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774449747.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62040.001, raw_value=62040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903458, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903500, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903521, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903531, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903555, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903569, tzinfo=datetime.timezone.utc))} (T+62103070 ms) 2026-03-25 14:43:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62103071 ms) 2026-03-25 14:43:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62103071 ms) 2026-03-25 14:43:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 43, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774449807.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878335, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62100.001, raw_value=62100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 28, 900647, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903692, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903768, tzinfo=datetime.timezone.utc))} (T+62103071 ms) 2026-03-25 14:43:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 42, 27, 878168, tzinfo=datetime.timezone.utc), raw_value=1774449747.878168, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62040.001, raw_value=62040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 27, 878501, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903458, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903485, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903500, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903511, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903521, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903531, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903542, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903555, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 42, 30, 903569, tzinfo=datetime.timezone.utc))} (T+62103072 ms) 2026-03-25 14:44:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62163068 ms) 2026-03-25 14:44:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62163069 ms) 2026-03-25 14:44:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 44, 27, 878416, tzinfo=datetime.timezone.utc), raw_value=1774449867.878416, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878566, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62160.001, raw_value=62160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878828, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904456, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904495, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904505, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904515, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904525, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904536, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904561, tzinfo=datetime.timezone.utc))} (T+62163069 ms) 2026-03-25 14:44:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 43, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774449807.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878335, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62100.001, raw_value=62100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 28, 900647, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903692, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903768, tzinfo=datetime.timezone.utc))} (T+62163070 ms) 2026-03-25 14:44:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62163071 ms) 2026-03-25 14:44:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62163071 ms) 2026-03-25 14:44:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 44, 27, 878416, tzinfo=datetime.timezone.utc), raw_value=1774449867.878416, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878566, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62160.001, raw_value=62160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878828, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904456, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904495, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904505, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904515, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904525, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904536, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904561, tzinfo=datetime.timezone.utc))} (T+62163072 ms) 2026-03-25 14:44:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 43, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774449807.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878335, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62100.001, raw_value=62100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 27, 878576, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 28, 900647, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903692, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903703, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 43, 30, 903768, tzinfo=datetime.timezone.utc))} (T+62163072 ms) 2026-03-25 14:45:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62223067 ms) 2026-03-25 14:45:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62223068 ms) 2026-03-25 14:45:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 45, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774449927.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62220.001, raw_value=62220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903437, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903477, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903545, tzinfo=datetime.timezone.utc))} (T+62223070 ms) 2026-03-25 14:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 44, 27, 878416, tzinfo=datetime.timezone.utc), raw_value=1774449867.878416, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878566, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62160.001, raw_value=62160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878828, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904456, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904495, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904505, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904515, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904525, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904536, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904561, tzinfo=datetime.timezone.utc))} (T+62223071 ms) 2026-03-25 14:45:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62223072 ms) 2026-03-25 14:45:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62223072 ms) 2026-03-25 14:45:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 45, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774449927.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62220.001, raw_value=62220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903437, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903477, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903545, tzinfo=datetime.timezone.utc))} (T+62223080 ms) 2026-03-25 14:45:30.919 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 44, 27, 878416, tzinfo=datetime.timezone.utc), raw_value=1774449867.878416, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878566, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62160.001, raw_value=62160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 27, 878828, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 28, 901463, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904456, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904483, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904495, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904505, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904515, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904525, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904536, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904546, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 44, 30, 904561, tzinfo=datetime.timezone.utc))} (T+62223081 ms) 2026-03-25 14:46:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62283068 ms) 2026-03-25 14:46:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62283068 ms) 2026-03-25 14:46:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 46, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774449987.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62280.001, raw_value=62280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 903998, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904025, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904097, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904111, tzinfo=datetime.timezone.utc))} (T+62283069 ms) 2026-03-25 14:46:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 45, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774449927.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62220.001, raw_value=62220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903437, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903477, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903545, tzinfo=datetime.timezone.utc))} (T+62283070 ms) 2026-03-25 14:46:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62283071 ms) 2026-03-25 14:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62283071 ms) 2026-03-25 14:46:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 46, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774449987.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62280.001, raw_value=62280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 903998, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904025, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904097, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904111, tzinfo=datetime.timezone.utc))} (T+62283072 ms) 2026-03-25 14:46:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 45, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774449927.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62220.001, raw_value=62220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 27, 878491, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 28, 900433, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903437, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903465, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903477, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903487, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903496, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903507, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903522, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903532, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 45, 30, 903545, tzinfo=datetime.timezone.utc))} (T+62283072 ms) 2026-03-25 14:47:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62343069 ms) 2026-03-25 14:47:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62343069 ms) 2026-03-25 14:47:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 47, 27, 878224, tzinfo=datetime.timezone.utc), raw_value=1774450047.878224, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62340.001, raw_value=62340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878610, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 28, 901856, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904817, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904844, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904856, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904909, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904919, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904930, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904944, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904958, tzinfo=datetime.timezone.utc))} (T+62343070 ms) 2026-03-25 14:47:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 46, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774449987.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62280.001, raw_value=62280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 903998, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904025, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904097, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904111, tzinfo=datetime.timezone.utc))} (T+62343070 ms) 2026-03-25 14:47:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62343071 ms) 2026-03-25 14:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62343071 ms) 2026-03-25 14:47:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 47, 27, 878224, tzinfo=datetime.timezone.utc), raw_value=1774450047.878224, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62340.001, raw_value=62340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878610, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 28, 901856, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904817, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904844, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904856, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904909, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904919, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904930, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904944, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904958, tzinfo=datetime.timezone.utc))} (T+62343072 ms) 2026-03-25 14:47:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 46, 27, 878169, tzinfo=datetime.timezone.utc), raw_value=1774449987.878169, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62280.001, raw_value=62280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 27, 878504, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 28, 901036, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 903998, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904025, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904039, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904051, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904061, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904071, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904097, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 46, 30, 904111, tzinfo=datetime.timezone.utc))} (T+62343073 ms) 2026-03-25 14:48:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62403068 ms) 2026-03-25 14:48:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62403069 ms) 2026-03-25 14:48:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 48, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774450107.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62400.001, raw_value=62400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 28, 901272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904305, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904336, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904375, tzinfo=datetime.timezone.utc))} (T+62403070 ms) 2026-03-25 14:48:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 47, 27, 878224, tzinfo=datetime.timezone.utc), raw_value=1774450047.878224, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62340.001, raw_value=62340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878610, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 28, 901856, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904817, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904844, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904856, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904909, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904919, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904930, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904944, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904958, tzinfo=datetime.timezone.utc))} (T+62403071 ms) 2026-03-25 14:48:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62403071 ms) 2026-03-25 14:48:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62403072 ms) 2026-03-25 14:48:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 48, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774450107.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62400.001, raw_value=62400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 28, 901272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904305, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904336, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904375, tzinfo=datetime.timezone.utc))} (T+62403072 ms) 2026-03-25 14:48:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 47, 27, 878224, tzinfo=datetime.timezone.utc), raw_value=1774450047.878224, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62340.001, raw_value=62340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 27, 878610, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 28, 901856, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904817, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904844, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904856, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904898, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904909, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904919, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904930, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904944, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 47, 30, 904958, tzinfo=datetime.timezone.utc))} (T+62403073 ms) 2026-03-25 14:49:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62463068 ms) 2026-03-25 14:49:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62463069 ms) 2026-03-25 14:49:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 49, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450167.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62460.001, raw_value=62460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 28, 901371, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904331, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904371, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904392, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904414, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904424, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904437, tzinfo=datetime.timezone.utc))} (T+62463070 ms) 2026-03-25 14:49:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 48, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774450107.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62400.001, raw_value=62400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 28, 901272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904305, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904336, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904375, tzinfo=datetime.timezone.utc))} (T+62463071 ms) 2026-03-25 14:49:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62463071 ms) 2026-03-25 14:49:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62463072 ms) 2026-03-25 14:49:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 49, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450167.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62460.001, raw_value=62460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 28, 901371, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904331, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904371, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904392, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904414, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904424, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904437, tzinfo=datetime.timezone.utc))} (T+62463072 ms) 2026-03-25 14:49:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 48, 27, 878205, tzinfo=datetime.timezone.utc), raw_value=1774450107.878205, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878329, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62400.001, raw_value=62400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 27, 878559, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 28, 901272, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904259, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904292, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904305, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904315, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904325, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904336, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904350, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904362, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 48, 30, 904375, tzinfo=datetime.timezone.utc))} (T+62463073 ms) 2026-03-25 14:50:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62523069 ms) 2026-03-25 14:50:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62523069 ms) 2026-03-25 14:50:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 50, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450227.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62520.001, raw_value=62520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 28, 901682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904768, tzinfo=datetime.timezone.utc))} (T+62523070 ms) 2026-03-25 14:50:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 49, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450167.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62460.001, raw_value=62460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 28, 901371, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904331, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904371, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904392, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904414, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904424, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904437, tzinfo=datetime.timezone.utc))} (T+62523071 ms) 2026-03-25 14:50:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62523071 ms) 2026-03-25 14:50:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62523071 ms) 2026-03-25 14:50:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 50, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450227.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62520.001, raw_value=62520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 28, 901682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904768, tzinfo=datetime.timezone.utc))} (T+62523073 ms) 2026-03-25 14:50:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 49, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450167.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878321, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62460.001, raw_value=62460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 27, 878531, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 28, 901371, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904331, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904371, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904381, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904392, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904402, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904414, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904424, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 49, 30, 904437, tzinfo=datetime.timezone.utc))} (T+62523074 ms) 2026-03-25 14:51:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62583068 ms) 2026-03-25 14:51:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62583069 ms) 2026-03-25 14:51:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774450287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62580.001, raw_value=62580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904226, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904266, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904307, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904317, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904330, tzinfo=datetime.timezone.utc))} (T+62583070 ms) 2026-03-25 14:51:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 50, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450227.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62520.001, raw_value=62520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 28, 901682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904768, tzinfo=datetime.timezone.utc))} (T+62583072 ms) 2026-03-25 14:51:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62583073 ms) 2026-03-25 14:51:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62583073 ms) 2026-03-25 14:51:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774450287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62580.001, raw_value=62580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904226, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904266, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904307, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904317, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904330, tzinfo=datetime.timezone.utc))} (T+62583073 ms) 2026-03-25 14:51:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 50, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450227.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62520.001, raw_value=62520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 28, 901682, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904688, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904724, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 50, 30, 904768, tzinfo=datetime.timezone.utc))} (T+62583074 ms) 2026-03-25 14:52:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62643067 ms) 2026-03-25 14:52:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62643068 ms) 2026-03-25 14:52:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 52, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774450347.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62640.001, raw_value=62640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903488, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903516, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903528, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903592, tzinfo=datetime.timezone.utc))} (T+62643069 ms) 2026-03-25 14:52:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774450287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62580.001, raw_value=62580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904226, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904266, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904307, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904317, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904330, tzinfo=datetime.timezone.utc))} (T+62643070 ms) 2026-03-25 14:52:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62643070 ms) 2026-03-25 14:52:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62643070 ms) 2026-03-25 14:52:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 52, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774450347.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62640.001, raw_value=62640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903488, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903516, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903528, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903592, tzinfo=datetime.timezone.utc))} (T+62643072 ms) 2026-03-25 14:52:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 51, 27, 878171, tzinfo=datetime.timezone.utc), raw_value=1774450287.878171, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62580.001, raw_value=62580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904226, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904255, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904266, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904276, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904287, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904297, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904307, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904317, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 51, 30, 904330, tzinfo=datetime.timezone.utc))} (T+62643073 ms) 2026-03-25 14:53:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62703067 ms) 2026-03-25 14:53:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62703068 ms) 2026-03-25 14:53:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 53, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450407.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62700.001, raw_value=62700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 28, 900303, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903326, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903412, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903439, tzinfo=datetime.timezone.utc))} (T+62703068 ms) 2026-03-25 14:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 52, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774450347.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62640.001, raw_value=62640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903488, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903516, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903528, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903592, tzinfo=datetime.timezone.utc))} (T+62703069 ms) 2026-03-25 14:53:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62703070 ms) 2026-03-25 14:53:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62703070 ms) 2026-03-25 14:53:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 53, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450407.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62700.001, raw_value=62700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 28, 900303, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903326, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903412, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903439, tzinfo=datetime.timezone.utc))} (T+62703071 ms) 2026-03-25 14:53:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 52, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774450347.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62640.001, raw_value=62640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 27, 878497, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 28, 900478, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903488, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903516, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903528, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903538, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903548, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903558, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903569, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903579, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 52, 30, 903592, tzinfo=datetime.timezone.utc))} (T+62703071 ms) 2026-03-25 14:54:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62763069 ms) 2026-03-25 14:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62763069 ms) 2026-03-25 14:54:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 54, 27, 878240, tzinfo=datetime.timezone.utc), raw_value=1774450467.87824, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878378, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62760.001, raw_value=62760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878625, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 28, 901573, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904529, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904582, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904592, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904602, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904613, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904623, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904640, tzinfo=datetime.timezone.utc))} (T+62763070 ms) 2026-03-25 14:54:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 53, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450407.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62700.001, raw_value=62700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 28, 900303, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903326, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903412, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903439, tzinfo=datetime.timezone.utc))} (T+62763071 ms) 2026-03-25 14:54:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62763071 ms) 2026-03-25 14:54:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62763071 ms) 2026-03-25 14:54:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 54, 27, 878240, tzinfo=datetime.timezone.utc), raw_value=1774450467.87824, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878378, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62760.001, raw_value=62760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878625, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 28, 901573, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904529, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904582, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904592, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904602, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904613, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904623, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904640, tzinfo=datetime.timezone.utc))} (T+62763072 ms) 2026-03-25 14:54:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 53, 27, 878167, tzinfo=datetime.timezone.utc), raw_value=1774450407.878167, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878273, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62700.001, raw_value=62700.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 27, 878486, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 28, 900303, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903326, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903356, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903369, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903379, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903390, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903400, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903412, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903425, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 53, 30, 903439, tzinfo=datetime.timezone.utc))} (T+62763073 ms) 2026-03-25 14:55:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62823068 ms) 2026-03-25 14:55:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62823068 ms) 2026-03-25 14:55:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 55, 27, 878220, tzinfo=datetime.timezone.utc), raw_value=1774450527.87822, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62820.001, raw_value=62820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878581, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904029, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904057, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904068, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904098, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904123, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904140, tzinfo=datetime.timezone.utc))} (T+62823069 ms) 2026-03-25 14:55:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 54, 27, 878240, tzinfo=datetime.timezone.utc), raw_value=1774450467.87824, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878378, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62760.001, raw_value=62760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878625, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 28, 901573, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904529, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904582, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904592, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904602, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904613, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904623, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904640, tzinfo=datetime.timezone.utc))} (T+62823070 ms) 2026-03-25 14:55:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62823071 ms) 2026-03-25 14:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62823071 ms) 2026-03-25 14:55:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 55, 27, 878220, tzinfo=datetime.timezone.utc), raw_value=1774450527.87822, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62820.001, raw_value=62820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878581, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904029, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904057, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904068, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904098, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904123, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904140, tzinfo=datetime.timezone.utc))} (T+62823072 ms) 2026-03-25 14:55:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 54, 27, 878240, tzinfo=datetime.timezone.utc), raw_value=1774450467.87824, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878378, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62760.001, raw_value=62760.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 27, 878625, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 28, 901573, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904529, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904556, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904570, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904582, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904592, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904602, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904613, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904623, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 54, 30, 904640, tzinfo=datetime.timezone.utc))} (T+62823073 ms) 2026-03-25 14:56:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62883069 ms) 2026-03-25 14:56:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62883069 ms) 2026-03-25 14:56:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 56, 27, 878235, tzinfo=datetime.timezone.utc), raw_value=1774450587.878235, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62880.001, raw_value=62880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878600, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 28, 901611, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904698, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904710, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904720, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904730, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904775, tzinfo=datetime.timezone.utc))} (T+62883071 ms) 2026-03-25 14:56:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 55, 27, 878220, tzinfo=datetime.timezone.utc), raw_value=1774450527.87822, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62820.001, raw_value=62820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878581, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904029, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904057, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904068, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904098, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904123, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904140, tzinfo=datetime.timezone.utc))} (T+62883072 ms) 2026-03-25 14:56:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62883073 ms) 2026-03-25 14:56:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62883073 ms) 2026-03-25 14:56:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 56, 27, 878235, tzinfo=datetime.timezone.utc), raw_value=1774450587.878235, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62880.001, raw_value=62880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878600, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 28, 901611, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904698, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904710, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904720, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904730, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904775, tzinfo=datetime.timezone.utc))} (T+62883077 ms) 2026-03-25 14:56:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 55, 27, 878220, tzinfo=datetime.timezone.utc), raw_value=1774450527.87822, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878344, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62820.001, raw_value=62820.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 27, 878581, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 28, 901048, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904029, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904057, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904068, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904079, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904089, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904098, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904109, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904123, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 55, 30, 904140, tzinfo=datetime.timezone.utc))} (T+62883078 ms) 2026-03-25 14:57:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+62943067 ms) 2026-03-25 14:57:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+62943068 ms) 2026-03-25 14:57:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 57, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774450647.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62940.001, raw_value=62940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 28, 900833, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903795, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903822, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903834, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903854, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903877, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903899, tzinfo=datetime.timezone.utc))} (T+62943070 ms) 2026-03-25 14:57:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 56, 27, 878235, tzinfo=datetime.timezone.utc), raw_value=1774450587.878235, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62880.001, raw_value=62880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878600, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 28, 901611, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904698, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904710, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904720, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904730, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904775, tzinfo=datetime.timezone.utc))} (T+62943071 ms) 2026-03-25 14:57:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+62943071 ms) 2026-03-25 14:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+62943071 ms) 2026-03-25 14:57:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 57, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774450647.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62940.001, raw_value=62940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 28, 900833, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903795, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903822, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903834, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903854, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903877, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903899, tzinfo=datetime.timezone.utc))} (T+62943072 ms) 2026-03-25 14:57:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 56, 27, 878235, tzinfo=datetime.timezone.utc), raw_value=1774450587.878235, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878361, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62880.001, raw_value=62880.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 27, 878600, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 28, 901611, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904665, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904698, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904710, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904720, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904730, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904740, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904752, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904762, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 56, 30, 904775, tzinfo=datetime.timezone.utc))} (T+62943073 ms) 2026-03-25 14:58:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63003067 ms) 2026-03-25 14:58:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63003068 ms) 2026-03-25 14:58:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 58, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774450707.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63000.001, raw_value=63000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 28, 900350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903397, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903407, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903441, tzinfo=datetime.timezone.utc))} (T+63003069 ms) 2026-03-25 14:58:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 57, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774450647.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62940.001, raw_value=62940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 28, 900833, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903795, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903822, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903834, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903854, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903877, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903899, tzinfo=datetime.timezone.utc))} (T+63003070 ms) 2026-03-25 14:58:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63003070 ms) 2026-03-25 14:58:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63003071 ms) 2026-03-25 14:58:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 58, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774450707.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63000.001, raw_value=63000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 28, 900350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903397, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903407, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903441, tzinfo=datetime.timezone.utc))} (T+63003071 ms) 2026-03-25 14:58:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 57, 27, 878164, tzinfo=datetime.timezone.utc), raw_value=1774450647.878164, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878271, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=62940.001, raw_value=62940.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 28, 900833, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903795, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903822, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903834, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903844, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903854, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903865, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903877, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903886, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 57, 30, 903899, tzinfo=datetime.timezone.utc))} (T+63003072 ms) 2026-03-25 14:59:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63063067 ms) 2026-03-25 14:59:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63063068 ms) 2026-03-25 14:59:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 59, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774450767.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63060.001, raw_value=63060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 28, 900665, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903672, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903700, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903711, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903722, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903732, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903757, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903767, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903783, tzinfo=datetime.timezone.utc))} (T+63063069 ms) 2026-03-25 14:59:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 58, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774450707.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63000.001, raw_value=63000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 28, 900350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903397, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903407, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903441, tzinfo=datetime.timezone.utc))} (T+63063070 ms) 2026-03-25 14:59:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63063070 ms) 2026-03-25 14:59:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63063071 ms) 2026-03-25 14:59:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 59, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774450767.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63060.001, raw_value=63060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 28, 900665, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903672, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903700, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903711, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903722, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903732, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903757, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903767, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903783, tzinfo=datetime.timezone.utc))} (T+63063071 ms) 2026-03-25 14:59:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 58, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774450707.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878276, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63000.001, raw_value=63000.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 27, 878505, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 28, 900350, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903332, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903360, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903387, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903397, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903407, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903418, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903428, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 58, 30, 903441, tzinfo=datetime.timezone.utc))} (T+63063072 ms) 2026-03-25 15:00:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63123067 ms) 2026-03-25 15:00:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63123068 ms) 2026-03-25 15:00:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 0, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774450827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63120.001, raw_value=63120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 28, 900456, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903528, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903540, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903550, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903592, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903606, tzinfo=datetime.timezone.utc))} (T+63123068 ms) 2026-03-25 15:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 59, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774450767.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63060.001, raw_value=63060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 28, 900665, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903672, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903700, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903711, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903722, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903732, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903757, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903767, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903783, tzinfo=datetime.timezone.utc))} (T+63123069 ms) 2026-03-25 15:00:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63123070 ms) 2026-03-25 15:00:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63123070 ms) 2026-03-25 15:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 0, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774450827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63120.001, raw_value=63120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 28, 900456, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903528, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903540, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903550, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903592, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903606, tzinfo=datetime.timezone.utc))} (T+63123070 ms) 2026-03-25 15:00:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 14, 59, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774450767.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878315, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63060.001, raw_value=63060.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 27, 878536, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 28, 900665, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903672, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903700, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903711, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903722, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903732, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903746, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903757, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903767, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 14, 59, 30, 903783, tzinfo=datetime.timezone.utc))} (T+63123071 ms) 2026-03-25 15:01:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63183067 ms) 2026-03-25 15:01:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63183068 ms) 2026-03-25 15:01:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 1, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774450887.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63180.001, raw_value=63180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 28, 900490, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903494, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903505, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903560, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903573, tzinfo=datetime.timezone.utc))} (T+63183070 ms) 2026-03-25 15:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 0, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774450827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63120.001, raw_value=63120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 28, 900456, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903528, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903540, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903550, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903592, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903606, tzinfo=datetime.timezone.utc))} (T+63183071 ms) 2026-03-25 15:01:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63183072 ms) 2026-03-25 15:01:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63183072 ms) 2026-03-25 15:01:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 1, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774450887.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63180.001, raw_value=63180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 28, 900490, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903494, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903505, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903560, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903573, tzinfo=datetime.timezone.utc))} (T+63183076 ms) 2026-03-25 15:01:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 0, 27, 878174, tzinfo=datetime.timezone.utc), raw_value=1774450827.878174, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878290, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63120.001, raw_value=63120.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 27, 878510, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 28, 900456, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903501, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903528, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903540, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903550, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903560, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903570, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903582, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903592, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 0, 30, 903606, tzinfo=datetime.timezone.utc))} (T+63183077 ms) 2026-03-25 15:02:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63243068 ms) 2026-03-25 15:02:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63243069 ms) 2026-03-25 15:02:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 2, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450947.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63240.001, raw_value=63240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 28, 901434, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904450, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904497, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904508, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904520, tzinfo=datetime.timezone.utc))} (T+63243070 ms) 2026-03-25 15:02:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 1, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774450887.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63180.001, raw_value=63180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 28, 900490, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903494, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903505, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903560, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903573, tzinfo=datetime.timezone.utc))} (T+63243071 ms) 2026-03-25 15:02:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63243071 ms) 2026-03-25 15:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63243072 ms) 2026-03-25 15:02:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 2, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450947.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63240.001, raw_value=63240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 28, 901434, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904450, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904497, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904508, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904520, tzinfo=datetime.timezone.utc))} (T+63243072 ms) 2026-03-25 15:02:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 1, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774450887.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878299, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63180.001, raw_value=63180.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 27, 878517, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 28, 900490, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903467, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903494, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903505, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903516, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903527, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903537, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903549, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903560, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 1, 30, 903573, tzinfo=datetime.timezone.utc))} (T+63243073 ms) 2026-03-25 15:03:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63303068 ms) 2026-03-25 15:03:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63303069 ms) 2026-03-25 15:03:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 3, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774451007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63300.001, raw_value=63300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 28, 901191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904162, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904191, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904203, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904213, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904275, tzinfo=datetime.timezone.utc))} (T+63303070 ms) 2026-03-25 15:03:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 2, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450947.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63240.001, raw_value=63240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 28, 901434, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904450, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904497, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904508, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904520, tzinfo=datetime.timezone.utc))} (T+63303071 ms) 2026-03-25 15:03:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63303071 ms) 2026-03-25 15:03:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63303071 ms) 2026-03-25 15:03:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 3, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774451007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63300.001, raw_value=63300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 28, 901191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904162, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904191, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904203, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904213, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904275, tzinfo=datetime.timezone.utc))} (T+63303072 ms) 2026-03-25 15:03:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 2, 27, 878210, tzinfo=datetime.timezone.utc), raw_value=1774450947.87821, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878323, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63240.001, raw_value=63240.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 27, 878534, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 28, 901434, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904407, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904436, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904450, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904462, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904472, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904497, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904508, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 2, 30, 904520, tzinfo=datetime.timezone.utc))} (T+63303073 ms) 2026-03-25 15:04:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63363067 ms) 2026-03-25 15:04:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63363068 ms) 2026-03-25 15:04:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 4, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774451067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63360.001, raw_value=63360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 28, 900591, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903567, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903594, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903606, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903672, tzinfo=datetime.timezone.utc))} (T+63363069 ms) 2026-03-25 15:04:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 3, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774451007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63300.001, raw_value=63300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 28, 901191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904162, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904191, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904203, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904213, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904275, tzinfo=datetime.timezone.utc))} (T+63363069 ms) 2026-03-25 15:04:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63363070 ms) 2026-03-25 15:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63363070 ms) 2026-03-25 15:04:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 4, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774451067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63360.001, raw_value=63360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 28, 900591, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903567, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903594, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903606, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903672, tzinfo=datetime.timezone.utc))} (T+63363071 ms) 2026-03-25 15:04:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 3, 27, 878176, tzinfo=datetime.timezone.utc), raw_value=1774451007.878176, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878282, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63300.001, raw_value=63300.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 27, 878487, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 28, 901191, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904162, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904191, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904203, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904213, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904223, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904237, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904252, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904263, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 3, 30, 904275, tzinfo=datetime.timezone.utc))} (T+63363071 ms) 2026-03-25 15:05:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63423067 ms) 2026-03-25 15:05:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63423068 ms) 2026-03-25 15:05:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 5, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451127.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63420.001, raw_value=63420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 28, 900686, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903691, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903767, tzinfo=datetime.timezone.utc))} (T+63423069 ms) 2026-03-25 15:05:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 4, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774451067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63360.001, raw_value=63360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 28, 900591, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903567, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903594, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903606, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903672, tzinfo=datetime.timezone.utc))} (T+63423069 ms) 2026-03-25 15:05:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63423070 ms) 2026-03-25 15:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63423070 ms) 2026-03-25 15:05:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 5, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451127.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63420.001, raw_value=63420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 28, 900686, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903691, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903767, tzinfo=datetime.timezone.utc))} (T+63423071 ms) 2026-03-25 15:05:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 4, 27, 878178, tzinfo=datetime.timezone.utc), raw_value=1774451067.878178, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878284, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63360.001, raw_value=63360.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 28, 900591, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903567, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903594, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903606, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903616, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903626, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903636, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903648, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903659, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 4, 30, 903672, tzinfo=datetime.timezone.utc))} (T+63423072 ms) 2026-03-25 15:06:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63483068 ms) 2026-03-25 15:06:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63483069 ms) 2026-03-25 15:06:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 6, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774451187.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63480.001, raw_value=63480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 903991, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904021, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904037, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904072, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904094, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904109, tzinfo=datetime.timezone.utc))} (T+63483070 ms) 2026-03-25 15:06:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 5, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451127.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63420.001, raw_value=63420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 28, 900686, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903691, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903767, tzinfo=datetime.timezone.utc))} (T+63483070 ms) 2026-03-25 15:06:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63483071 ms) 2026-03-25 15:06:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63483071 ms) 2026-03-25 15:06:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 6, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774451187.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63480.001, raw_value=63480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 903991, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904021, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904037, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904072, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904094, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904109, tzinfo=datetime.timezone.utc))} (T+63483072 ms) 2026-03-25 15:06:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 5, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451127.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63420.001, raw_value=63420.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 27, 878498, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 28, 900686, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903664, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903691, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903713, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903744, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903754, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 5, 30, 903767, tzinfo=datetime.timezone.utc))} (T+63483073 ms) 2026-03-25 15:07:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63543067 ms) 2026-03-25 15:07:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63543067 ms) 2026-03-25 15:07:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 7, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774451247.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63540.001, raw_value=63540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 28, 900109, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903052, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903094, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903115, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903129, tzinfo=datetime.timezone.utc))} (T+63543068 ms) 2026-03-25 15:07:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 6, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774451187.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63480.001, raw_value=63480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 903991, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904021, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904037, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904072, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904094, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904109, tzinfo=datetime.timezone.utc))} (T+63543069 ms) 2026-03-25 15:07:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63543069 ms) 2026-03-25 15:07:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63543070 ms) 2026-03-25 15:07:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 7, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774451247.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63540.001, raw_value=63540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 28, 900109, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903052, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903094, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903115, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903129, tzinfo=datetime.timezone.utc))} (T+63543070 ms) 2026-03-25 15:07:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 6, 27, 878198, tzinfo=datetime.timezone.utc), raw_value=1774451187.878198, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63480.001, raw_value=63480.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 28, 900959, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 903991, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904021, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904037, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904049, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904060, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904072, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904083, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904094, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 6, 30, 904109, tzinfo=datetime.timezone.utc))} (T+63543071 ms) 2026-03-25 15:08:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63603067 ms) 2026-03-25 15:08:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63603068 ms) 2026-03-25 15:08:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 8, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774451307.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63600.001, raw_value=63600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 28, 900644, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903632, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903681, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903701, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903739, tzinfo=datetime.timezone.utc))} (T+63603069 ms) 2026-03-25 15:08:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 7, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774451247.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63540.001, raw_value=63540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 28, 900109, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903052, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903094, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903115, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903129, tzinfo=datetime.timezone.utc))} (T+63603069 ms) 2026-03-25 15:08:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63603070 ms) 2026-03-25 15:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63603070 ms) 2026-03-25 15:08:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 8, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774451307.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63600.001, raw_value=63600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 28, 900644, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903632, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903681, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903701, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903739, tzinfo=datetime.timezone.utc))} (T+63603071 ms) 2026-03-25 15:08:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 7, 27, 878190, tzinfo=datetime.timezone.utc), raw_value=1774451247.87819, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63540.001, raw_value=63540.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 27, 878509, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 28, 900109, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903025, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903052, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903074, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903084, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903094, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903106, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903115, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 7, 30, 903129, tzinfo=datetime.timezone.utc))} (T+63603072 ms) 2026-03-25 15:09:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63663068 ms) 2026-03-25 15:09:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63663068 ms) 2026-03-25 15:09:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 9, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451367.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63660.001, raw_value=63660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 28, 900637, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903833, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903844, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903920, tzinfo=datetime.timezone.utc))} (T+63663070 ms) 2026-03-25 15:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 8, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774451307.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63600.001, raw_value=63600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 28, 900644, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903632, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903681, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903701, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903739, tzinfo=datetime.timezone.utc))} (T+63663071 ms) 2026-03-25 15:09:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63663072 ms) 2026-03-25 15:09:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63663072 ms) 2026-03-25 15:09:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 9, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451367.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63660.001, raw_value=63660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 28, 900637, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903833, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903844, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903920, tzinfo=datetime.timezone.utc))} (T+63663076 ms) 2026-03-25 15:09:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 8, 27, 878158, tzinfo=datetime.timezone.utc), raw_value=1774451307.878158, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63600.001, raw_value=63600.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 28, 900644, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903632, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903658, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903670, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903681, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903691, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903701, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 8, 30, 903739, tzinfo=datetime.timezone.utc))} (T+63663077 ms) 2026-03-25 15:10:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63723069 ms) 2026-03-25 15:10:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63723069 ms) 2026-03-25 15:10:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 10, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774451427.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63720.001, raw_value=63720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878677, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 28, 901616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904676, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904735, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904757, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904793, tzinfo=datetime.timezone.utc))} (T+63723070 ms) 2026-03-25 15:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 9, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451367.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63660.001, raw_value=63660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 28, 900637, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903833, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903844, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903920, tzinfo=datetime.timezone.utc))} (T+63723071 ms) 2026-03-25 15:10:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63723072 ms) 2026-03-25 15:10:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63723072 ms) 2026-03-25 15:10:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 10, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774451427.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63720.001, raw_value=63720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878677, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 28, 901616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904676, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904735, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904757, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904793, tzinfo=datetime.timezone.utc))} (T+63723073 ms) 2026-03-25 15:10:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 9, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451367.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63660.001, raw_value=63660.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 27, 878520, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 28, 900637, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903791, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903833, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903844, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903856, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903882, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903896, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903906, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 9, 30, 903920, tzinfo=datetime.timezone.utc))} (T+63723073 ms) 2026-03-25 15:11:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63783067 ms) 2026-03-25 15:11:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63783068 ms) 2026-03-25 15:11:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 11, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774451487.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63780.001, raw_value=63780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 28, 900409, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903460, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903472, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903483, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903539, tzinfo=datetime.timezone.utc))} (T+63783069 ms) 2026-03-25 15:11:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 10, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774451427.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63720.001, raw_value=63720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878677, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 28, 901616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904676, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904735, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904757, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904793, tzinfo=datetime.timezone.utc))} (T+63783070 ms) 2026-03-25 15:11:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63783071 ms) 2026-03-25 15:11:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63783071 ms) 2026-03-25 15:11:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 11, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774451487.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63780.001, raw_value=63780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 28, 900409, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903460, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903472, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903483, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903539, tzinfo=datetime.timezone.utc))} (T+63783071 ms) 2026-03-25 15:11:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 10, 27, 878163, tzinfo=datetime.timezone.utc), raw_value=1774451427.878163, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878274, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63720.001, raw_value=63720.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 27, 878677, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 28, 901616, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904676, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904709, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904735, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904746, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904757, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 10, 30, 904793, tzinfo=datetime.timezone.utc))} (T+63783072 ms) 2026-03-25 15:12:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63843067 ms) 2026-03-25 15:12:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63843068 ms) 2026-03-25 15:12:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 12, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774451547.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63840.001, raw_value=63840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 28, 900403, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903374, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903402, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903414, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903434, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903444, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903482, tzinfo=datetime.timezone.utc))} (T+63843070 ms) 2026-03-25 15:12:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 11, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774451487.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63780.001, raw_value=63780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 28, 900409, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903460, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903472, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903483, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903539, tzinfo=datetime.timezone.utc))} (T+63843071 ms) 2026-03-25 15:12:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63843072 ms) 2026-03-25 15:12:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63843072 ms) 2026-03-25 15:12:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 12, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774451547.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63840.001, raw_value=63840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 28, 900403, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903374, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903402, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903414, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903434, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903444, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903482, tzinfo=datetime.timezone.utc))} (T+63843072 ms) 2026-03-25 15:12:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 11, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774451487.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878251, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63780.001, raw_value=63780.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 27, 878460, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 28, 900409, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903430, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903460, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903472, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903483, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903504, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903515, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903525, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 11, 30, 903539, tzinfo=datetime.timezone.utc))} (T+63843073 ms) 2026-03-25 15:13:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63903068 ms) 2026-03-25 15:13:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63903069 ms) 2026-03-25 15:13:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 13, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451607.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63900.001, raw_value=63900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 28, 901190, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904177, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904210, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904241, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904256, tzinfo=datetime.timezone.utc))} (T+63903069 ms) 2026-03-25 15:13:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 12, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774451547.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63840.001, raw_value=63840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 28, 900403, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903374, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903402, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903414, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903434, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903444, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903482, tzinfo=datetime.timezone.utc))} (T+63903070 ms) 2026-03-25 15:13:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63903071 ms) 2026-03-25 15:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63903071 ms) 2026-03-25 15:13:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 13, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451607.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63900.001, raw_value=63900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 28, 901190, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904177, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904210, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904241, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904256, tzinfo=datetime.timezone.utc))} (T+63903072 ms) 2026-03-25 15:13:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 12, 27, 878173, tzinfo=datetime.timezone.utc), raw_value=1774451547.878173, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63840.001, raw_value=63840.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 28, 900403, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903374, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903402, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903414, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903424, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903434, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903444, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903458, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903469, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 12, 30, 903482, tzinfo=datetime.timezone.utc))} (T+63903072 ms) 2026-03-25 15:14:30.905 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+63963067 ms) 2026-03-25 15:14:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+63963067 ms) 2026-03-25 15:14:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774451667.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63960.001, raw_value=63960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 28, 900193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903170, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903198, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903213, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903224, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903235, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903256, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903266, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903279, tzinfo=datetime.timezone.utc))} (T+63963068 ms) 2026-03-25 15:14:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 13, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451607.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63900.001, raw_value=63900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 28, 901190, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904177, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904210, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904241, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904256, tzinfo=datetime.timezone.utc))} (T+63963069 ms) 2026-03-25 15:14:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+63963070 ms) 2026-03-25 15:14:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+63963070 ms) 2026-03-25 15:14:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774451667.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63960.001, raw_value=63960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 28, 900193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903170, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903198, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903213, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903224, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903235, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903256, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903266, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903279, tzinfo=datetime.timezone.utc))} (T+63963071 ms) 2026-03-25 15:14:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 13, 27, 878180, tzinfo=datetime.timezone.utc), raw_value=1774451607.87818, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878296, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63900.001, raw_value=63900.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 27, 878512, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 28, 901190, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904148, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904177, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904189, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904199, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904210, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904219, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904230, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904241, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 13, 30, 904256, tzinfo=datetime.timezone.utc))} (T+63963071 ms) 2026-03-25 15:15:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64023069 ms) 2026-03-25 15:15:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64023069 ms) 2026-03-25 15:15:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878463, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64020.001, raw_value=64020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878853, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 28, 901579, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904685, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904713, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904744, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904754, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904792, tzinfo=datetime.timezone.utc))} (T+64023072 ms) 2026-03-25 15:15:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774451667.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63960.001, raw_value=63960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 28, 900193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903170, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903198, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903213, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903224, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903235, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903256, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903266, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903279, tzinfo=datetime.timezone.utc))} (T+64023073 ms) 2026-03-25 15:15:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64023074 ms) 2026-03-25 15:15:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64023074 ms) 2026-03-25 15:15:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878463, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64020.001, raw_value=64020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878853, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 28, 901579, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904685, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904713, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904744, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904754, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904792, tzinfo=datetime.timezone.utc))} (T+64023083 ms) 2026-03-25 15:15:30.922 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 14, 27, 878161, tzinfo=datetime.timezone.utc), raw_value=1774451667.878161, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878270, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=63960.001, raw_value=63960.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 27, 878479, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 28, 900193, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903170, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903198, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903213, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903224, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903235, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903244, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903256, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903266, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 14, 30, 903279, tzinfo=datetime.timezone.utc))} (T+64023084 ms) 2026-03-25 15:16:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64083069 ms) 2026-03-25 15:16:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64083069 ms) 2026-03-25 15:16:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 16, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774451787.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64080.001, raw_value=64080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878582, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 28, 902055, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905053, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905104, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905114, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905124, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905135, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905145, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905159, tzinfo=datetime.timezone.utc))} (T+64083070 ms) 2026-03-25 15:16:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878463, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64020.001, raw_value=64020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878853, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 28, 901579, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904685, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904713, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904744, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904754, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904792, tzinfo=datetime.timezone.utc))} (T+64083071 ms) 2026-03-25 15:16:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64083072 ms) 2026-03-25 15:16:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64083072 ms) 2026-03-25 15:16:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 16, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774451787.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64080.001, raw_value=64080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878582, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 28, 902055, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905053, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905104, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905114, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905124, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905135, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905145, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905159, tzinfo=datetime.timezone.utc))} (T+64083073 ms) 2026-03-25 15:16:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 15, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451727.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878463, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64020.001, raw_value=64020.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 27, 878853, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 28, 901579, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904685, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904713, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904724, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904734, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904744, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904754, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904768, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904779, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 15, 30, 904792, tzinfo=datetime.timezone.utc))} (T+64083073 ms) 2026-03-25 15:17:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64143068 ms) 2026-03-25 15:17:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64143069 ms) 2026-03-25 15:17:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 17, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451847.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64140.001, raw_value=64140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 28, 901019, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904016, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904027, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904047, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904058, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904068, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904097, tzinfo=datetime.timezone.utc))} (T+64143070 ms) 2026-03-25 15:17:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 16, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774451787.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64080.001, raw_value=64080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878582, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 28, 902055, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905053, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905104, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905114, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905124, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905135, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905145, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905159, tzinfo=datetime.timezone.utc))} (T+64143070 ms) 2026-03-25 15:17:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64143071 ms) 2026-03-25 15:17:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64143072 ms) 2026-03-25 15:17:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 17, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451847.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64140.001, raw_value=64140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 28, 901019, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904016, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904027, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904047, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904058, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904068, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904097, tzinfo=datetime.timezone.utc))} (T+64143072 ms) 2026-03-25 15:17:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 16, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774451787.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64080.001, raw_value=64080.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 27, 878582, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 28, 902055, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905053, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905081, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905093, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905104, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905114, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905124, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905135, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905145, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 16, 30, 905159, tzinfo=datetime.timezone.utc))} (T+64143073 ms) 2026-03-25 15:18:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64203068 ms) 2026-03-25 15:18:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64203069 ms) 2026-03-25 15:18:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 18, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774451907.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64200.001, raw_value=64200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 28, 901392, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904335, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904388, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904422, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904445, tzinfo=datetime.timezone.utc))} (T+64203069 ms) 2026-03-25 15:18:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 17, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451847.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64140.001, raw_value=64140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 28, 901019, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904016, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904027, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904047, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904058, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904068, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904097, tzinfo=datetime.timezone.utc))} (T+64203070 ms) 2026-03-25 15:18:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64203071 ms) 2026-03-25 15:18:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64203071 ms) 2026-03-25 15:18:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 18, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774451907.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64200.001, raw_value=64200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 28, 901392, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904335, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904388, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904422, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904445, tzinfo=datetime.timezone.utc))} (T+64203072 ms) 2026-03-25 15:18:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 17, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774451847.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878281, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64140.001, raw_value=64140.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 27, 878475, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 28, 901019, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 903986, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904016, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904027, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904038, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904047, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904058, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904068, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904082, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 17, 30, 904097, tzinfo=datetime.timezone.utc))} (T+64203072 ms) 2026-03-25 15:19:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64263068 ms) 2026-03-25 15:19:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64263068 ms) 2026-03-25 15:19:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 19, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774451967.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64260.001, raw_value=64260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903806, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903835, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903847, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903888, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903911, tzinfo=datetime.timezone.utc))} (T+64263069 ms) 2026-03-25 15:19:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 18, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774451907.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64200.001, raw_value=64200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 28, 901392, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904335, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904388, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904422, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904445, tzinfo=datetime.timezone.utc))} (T+64263070 ms) 2026-03-25 15:19:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64263071 ms) 2026-03-25 15:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64263071 ms) 2026-03-25 15:19:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 19, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774451967.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64260.001, raw_value=64260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903806, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903835, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903847, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903888, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903911, tzinfo=datetime.timezone.utc))} (T+64263072 ms) 2026-03-25 15:19:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 18, 27, 878221, tzinfo=datetime.timezone.utc), raw_value=1774451907.878221, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878342, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64200.001, raw_value=64200.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 27, 878580, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 28, 901392, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904335, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904362, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904376, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904388, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904398, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904408, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904422, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904433, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 18, 30, 904445, tzinfo=datetime.timezone.utc))} (T+64263072 ms) 2026-03-25 15:20:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64323067 ms) 2026-03-25 15:20:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64323068 ms) 2026-03-25 15:20:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 20, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774452027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64320.001, raw_value=64320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 28, 900472, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903459, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903470, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903513, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903539, tzinfo=datetime.timezone.utc))} (T+64323068 ms) 2026-03-25 15:20:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 19, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774451967.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64260.001, raw_value=64260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903806, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903835, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903847, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903888, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903911, tzinfo=datetime.timezone.utc))} (T+64323071 ms) 2026-03-25 15:20:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64323071 ms) 2026-03-25 15:20:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64323071 ms) 2026-03-25 15:20:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 20, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774452027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64320.001, raw_value=64320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 28, 900472, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903459, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903470, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903513, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903539, tzinfo=datetime.timezone.utc))} (T+64323072 ms) 2026-03-25 15:20:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 19, 27, 878191, tzinfo=datetime.timezone.utc), raw_value=1774451967.878191, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878301, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64260.001, raw_value=64260.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 28, 900765, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903806, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903835, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903847, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903857, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903867, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903877, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903888, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903898, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 19, 30, 903911, tzinfo=datetime.timezone.utc))} (T+64323073 ms) 2026-03-25 15:21:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64383068 ms) 2026-03-25 15:21:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64383068 ms) 2026-03-25 15:21:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 21, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774452087.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64380.001, raw_value=64380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 28, 901066, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904105, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904120, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904134, tzinfo=datetime.timezone.utc))} (T+64383071 ms) 2026-03-25 15:21:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 20, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774452027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64320.001, raw_value=64320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 28, 900472, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903459, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903470, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903513, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903539, tzinfo=datetime.timezone.utc))} (T+64383072 ms) 2026-03-25 15:21:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64383073 ms) 2026-03-25 15:21:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64383073 ms) 2026-03-25 15:21:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 21, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774452087.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64380.001, raw_value=64380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 28, 901066, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904105, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904120, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904134, tzinfo=datetime.timezone.utc))} (T+64383078 ms) 2026-03-25 15:21:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 20, 27, 878184, tzinfo=datetime.timezone.utc), raw_value=1774452027.878184, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878298, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64320.001, raw_value=64320.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 27, 878521, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 28, 900472, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903432, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903459, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903470, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903481, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903491, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903501, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903513, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903523, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 20, 30, 903539, tzinfo=datetime.timezone.utc))} (T+64383078 ms) 2026-03-25 15:22:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64443068 ms) 2026-03-25 15:22:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64443069 ms) 2026-03-25 15:22:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 22, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774452147.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64440.001, raw_value=64440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 28, 901451, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904418, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904446, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904513, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904527, tzinfo=datetime.timezone.utc))} (T+64443071 ms) 2026-03-25 15:22:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 21, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774452087.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64380.001, raw_value=64380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 28, 901066, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904105, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904120, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904134, tzinfo=datetime.timezone.utc))} (T+64443072 ms) 2026-03-25 15:22:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64443073 ms) 2026-03-25 15:22:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64443073 ms) 2026-03-25 15:22:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 22, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774452147.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64440.001, raw_value=64440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 28, 901451, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904418, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904446, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904513, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904527, tzinfo=datetime.timezone.utc))} (T+64443074 ms) 2026-03-25 15:22:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 21, 27, 878194, tzinfo=datetime.timezone.utc), raw_value=1774452087.878194, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878310, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64380.001, raw_value=64380.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 27, 878528, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 28, 901066, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904024, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904053, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904064, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904075, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904085, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904095, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904105, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904120, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 21, 30, 904134, tzinfo=datetime.timezone.utc))} (T+64443074 ms) 2026-03-25 15:23:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64503068 ms) 2026-03-25 15:23:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64503069 ms) 2026-03-25 15:23:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 23, 27, 878246, tzinfo=datetime.timezone.utc), raw_value=1774452207.878246, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878384, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64500.001, raw_value=64500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878639, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 28, 901754, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904698, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904726, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904737, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904747, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904771, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904792, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904806, tzinfo=datetime.timezone.utc))} (T+64503071 ms) 2026-03-25 15:23:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 22, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774452147.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64440.001, raw_value=64440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 28, 901451, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904418, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904446, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904513, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904527, tzinfo=datetime.timezone.utc))} (T+64503072 ms) 2026-03-25 15:23:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64503072 ms) 2026-03-25 15:23:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64503073 ms) 2026-03-25 15:23:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 23, 27, 878246, tzinfo=datetime.timezone.utc), raw_value=1774452207.878246, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878384, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64500.001, raw_value=64500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878639, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 28, 901754, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904698, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904726, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904737, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904747, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904771, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904792, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904806, tzinfo=datetime.timezone.utc))} (T+64503073 ms) 2026-03-25 15:23:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 22, 27, 878216, tzinfo=datetime.timezone.utc), raw_value=1774452147.878216, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878337, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64440.001, raw_value=64440.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 27, 878572, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 28, 901451, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904418, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904446, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904471, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904482, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904492, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904513, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 22, 30, 904527, tzinfo=datetime.timezone.utc))} (T+64503074 ms) 2026-03-25 15:24:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64563068 ms) 2026-03-25 15:24:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64563068 ms) 2026-03-25 15:24:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 24, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452267.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64560.001, raw_value=64560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 28, 900629, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903769, tzinfo=datetime.timezone.utc))} (T+64563070 ms) 2026-03-25 15:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 23, 27, 878246, tzinfo=datetime.timezone.utc), raw_value=1774452207.878246, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878384, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64500.001, raw_value=64500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878639, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 28, 901754, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904698, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904726, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904737, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904747, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904771, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904792, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904806, tzinfo=datetime.timezone.utc))} (T+64563071 ms) 2026-03-25 15:24:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64563072 ms) 2026-03-25 15:24:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64563072 ms) 2026-03-25 15:24:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 24, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452267.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64560.001, raw_value=64560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 28, 900629, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903769, tzinfo=datetime.timezone.utc))} (T+64563073 ms) 2026-03-25 15:24:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 23, 27, 878246, tzinfo=datetime.timezone.utc), raw_value=1774452207.878246, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878384, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64500.001, raw_value=64500.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 27, 878639, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 28, 901754, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904698, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904726, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904737, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904747, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904758, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904771, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904783, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904792, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 23, 30, 904806, tzinfo=datetime.timezone.utc))} (T+64563073 ms) 2026-03-25 15:25:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64623068 ms) 2026-03-25 15:25:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64623068 ms) 2026-03-25 15:25:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 25, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774452327.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64620.001, raw_value=64620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 28, 900543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903634, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903661, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903673, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903739, tzinfo=datetime.timezone.utc))} (T+64623069 ms) 2026-03-25 15:25:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 24, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452267.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64560.001, raw_value=64560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 28, 900629, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903769, tzinfo=datetime.timezone.utc))} (T+64623069 ms) 2026-03-25 15:25:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64623070 ms) 2026-03-25 15:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64623070 ms) 2026-03-25 15:25:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 25, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774452327.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64620.001, raw_value=64620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 28, 900543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903634, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903661, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903673, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903739, tzinfo=datetime.timezone.utc))} (T+64623071 ms) 2026-03-25 15:25:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 24, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452267.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878300, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64560.001, raw_value=64560.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 27, 878519, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 28, 900629, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903690, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903702, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903712, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903723, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903733, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903745, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903755, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 24, 30, 903769, tzinfo=datetime.timezone.utc))} (T+64623071 ms) 2026-03-25 15:26:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64683068 ms) 2026-03-25 15:26:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64683068 ms) 2026-03-25 15:26:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 26, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774452387.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64680.001, raw_value=64680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904183, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904245, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904266, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904276, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904289, tzinfo=datetime.timezone.utc))} (T+64683071 ms) 2026-03-25 15:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 25, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774452327.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64620.001, raw_value=64620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 28, 900543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903634, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903661, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903673, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903739, tzinfo=datetime.timezone.utc))} (T+64683072 ms) 2026-03-25 15:26:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64683073 ms) 2026-03-25 15:26:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64683073 ms) 2026-03-25 15:26:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 26, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774452387.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64680.001, raw_value=64680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904183, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904245, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904266, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904276, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904289, tzinfo=datetime.timezone.utc))} (T+64683078 ms) 2026-03-25 15:26:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 25, 27, 878154, tzinfo=datetime.timezone.utc), raw_value=1774452327.878154, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878266, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64620.001, raw_value=64620.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 27, 878480, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 28, 900543, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903634, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903661, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903673, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903694, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903705, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903715, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903725, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 25, 30, 903739, tzinfo=datetime.timezone.utc))} (T+64683079 ms) 2026-03-25 15:27:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64743068 ms) 2026-03-25 15:27:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64743069 ms) 2026-03-25 15:27:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 27, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774452447.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64740.001, raw_value=64740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 28, 901335, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904383, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904413, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904425, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904436, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904446, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904491, tzinfo=datetime.timezone.utc))} (T+64743072 ms) 2026-03-25 15:27:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 26, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774452387.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64680.001, raw_value=64680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904183, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904245, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904266, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904276, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904289, tzinfo=datetime.timezone.utc))} (T+64743073 ms) 2026-03-25 15:27:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64743073 ms) 2026-03-25 15:27:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64743073 ms) 2026-03-25 15:27:30.917 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 27, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774452447.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64740.001, raw_value=64740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 28, 901335, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904383, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904413, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904425, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904436, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904446, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904491, tzinfo=datetime.timezone.utc))} (T+64743079 ms) 2026-03-25 15:27:30.918 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 26, 27, 878197, tzinfo=datetime.timezone.utc), raw_value=1774452387.878197, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64680.001, raw_value=64680.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 27, 878529, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 28, 901231, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904183, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904210, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904245, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904266, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904276, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 26, 30, 904289, tzinfo=datetime.timezone.utc))} (T+64743079 ms) 2026-03-25 15:28:30.907 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64803068 ms) 2026-03-25 15:28:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64803069 ms) 2026-03-25 15:28:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 28, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452507.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64800.001, raw_value=64800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878611, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 28, 901416, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904384, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904412, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904423, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904433, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904443, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904490, tzinfo=datetime.timezone.utc))} (T+64803072 ms) 2026-03-25 15:28:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 27, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774452447.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64740.001, raw_value=64740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 28, 901335, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904383, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904413, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904425, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904436, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904446, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904491, tzinfo=datetime.timezone.utc))} (T+64803073 ms) 2026-03-25 15:28:30.912 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64803073 ms) 2026-03-25 15:28:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64803073 ms) 2026-03-25 15:28:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 28, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452507.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64800.001, raw_value=64800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878611, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 28, 901416, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904384, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904412, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904423, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904433, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904443, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904490, tzinfo=datetime.timezone.utc))} (T+64803074 ms) 2026-03-25 15:28:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 27, 27, 878212, tzinfo=datetime.timezone.utc), raw_value=1774452447.878212, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878333, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64740.001, raw_value=64740.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 27, 878569, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 28, 901335, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904383, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904413, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904425, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904436, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904446, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 27, 30, 904491, tzinfo=datetime.timezone.utc))} (T+64803075 ms) 2026-03-25 15:29:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64863068 ms) 2026-03-25 15:29:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64863068 ms) 2026-03-25 15:29:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 29, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452567.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64860.001, raw_value=64860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878593, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 28, 901246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904186, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904214, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904275, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904288, tzinfo=datetime.timezone.utc))} (T+64863069 ms) 2026-03-25 15:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 28, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452507.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64800.001, raw_value=64800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878611, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 28, 901416, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904384, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904412, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904423, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904433, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904443, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904490, tzinfo=datetime.timezone.utc))} (T+64863070 ms) 2026-03-25 15:29:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64863071 ms) 2026-03-25 15:29:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64863071 ms) 2026-03-25 15:29:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 29, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452567.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64860.001, raw_value=64860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878593, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 28, 901246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904186, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904214, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904275, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904288, tzinfo=datetime.timezone.utc))} (T+64863072 ms) 2026-03-25 15:29:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 28, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452507.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878364, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64800.001, raw_value=64800.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 27, 878611, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 28, 901416, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904384, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904412, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904423, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904433, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904443, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904456, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904467, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904477, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 28, 30, 904490, tzinfo=datetime.timezone.utc))} (T+64863072 ms) 2026-03-25 15:30:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64923068 ms) 2026-03-25 15:30:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64923068 ms) 2026-03-25 15:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 30, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774452627.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64920.001, raw_value=64920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903903, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903945, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903967, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903977, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 904011, tzinfo=datetime.timezone.utc))} (T+64923070 ms) 2026-03-25 15:30:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 29, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452567.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64860.001, raw_value=64860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878593, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 28, 901246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904186, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904214, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904275, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904288, tzinfo=datetime.timezone.utc))} (T+64923071 ms) 2026-03-25 15:30:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64923072 ms) 2026-03-25 15:30:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64923072 ms) 2026-03-25 15:30:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 30, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774452627.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64920.001, raw_value=64920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903903, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903945, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903967, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903977, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 904011, tzinfo=datetime.timezone.utc))} (T+64923075 ms) 2026-03-25 15:30:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 29, 27, 878226, tzinfo=datetime.timezone.utc), raw_value=1774452567.878226, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878353, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64860.001, raw_value=64860.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 27, 878593, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 28, 901246, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904186, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904214, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904224, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904235, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904244, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904255, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904265, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904275, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 29, 30, 904288, tzinfo=datetime.timezone.utc))} (T+64923076 ms) 2026-03-25 15:31:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+64983068 ms) 2026-03-25 15:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+64983068 ms) 2026-03-25 15:31:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 31, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774452687.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64980.001, raw_value=64980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903890, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903918, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903929, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903960, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903971, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903981, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903994, tzinfo=datetime.timezone.utc))} (T+64983069 ms) 2026-03-25 15:31:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 30, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774452627.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64920.001, raw_value=64920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903903, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903945, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903967, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903977, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 904011, tzinfo=datetime.timezone.utc))} (T+64983070 ms) 2026-03-25 15:31:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+64983070 ms) 2026-03-25 15:31:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+64983071 ms) 2026-03-25 15:31:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 31, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774452687.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64980.001, raw_value=64980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903890, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903918, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903929, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903960, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903971, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903981, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903994, tzinfo=datetime.timezone.utc))} (T+64983075 ms) 2026-03-25 15:31:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 30, 27, 878182, tzinfo=datetime.timezone.utc), raw_value=1774452627.878182, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64920.001, raw_value=64920.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 27, 878507, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903903, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903931, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903945, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903956, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903967, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903977, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903987, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 903997, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 30, 30, 904011, tzinfo=datetime.timezone.utc))} (T+64983076 ms) 2026-03-25 15:32:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65043068 ms) 2026-03-25 15:32:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65043068 ms) 2026-03-25 15:32:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 32, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774452747.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65040.001, raw_value=65040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 28, 900777, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903810, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903895, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903905, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65043069 ms) 2026-03-25 15:32:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 31, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774452687.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64980.001, raw_value=64980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903890, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903918, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903929, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903960, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903971, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903981, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903994, tzinfo=datetime.timezone.utc))} (T+65043070 ms) 2026-03-25 15:32:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65043070 ms) 2026-03-25 15:32:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65043071 ms) 2026-03-25 15:32:30.913 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 32, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774452747.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65040.001, raw_value=65040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 28, 900777, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903810, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903895, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903905, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65043075 ms) 2026-03-25 15:32:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 31, 27, 878189, tzinfo=datetime.timezone.utc), raw_value=1774452687.878189, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878303, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=64980.001, raw_value=64980.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 28, 900956, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903890, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903918, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903929, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903939, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903949, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903960, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903971, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903981, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 31, 30, 903994, tzinfo=datetime.timezone.utc))} (T+65043076 ms) 2026-03-25 15:33:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65103067 ms) 2026-03-25 15:33:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65103068 ms) 2026-03-25 15:33:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 33, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774452807.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65100.001, raw_value=65100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 28, 900653, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903687, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903729, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903764, tzinfo=datetime.timezone.utc))} (T+65103070 ms) 2026-03-25 15:33:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 32, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774452747.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65040.001, raw_value=65040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 28, 900777, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903810, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903895, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903905, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65103071 ms) 2026-03-25 15:33:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65103071 ms) 2026-03-25 15:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65103071 ms) 2026-03-25 15:33:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 33, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774452807.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65100.001, raw_value=65100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 28, 900653, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903687, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903729, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903764, tzinfo=datetime.timezone.utc))} (T+65103072 ms) 2026-03-25 15:33:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 32, 27, 878193, tzinfo=datetime.timezone.utc), raw_value=1774452747.878193, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878312, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65040.001, raw_value=65040.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 27, 878539, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 28, 900777, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903810, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903850, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903880, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903895, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903905, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 32, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65103073 ms) 2026-03-25 15:34:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65163068 ms) 2026-03-25 15:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65163068 ms) 2026-03-25 15:34:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 34, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452867.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65160.001, raw_value=65160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903827, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903854, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903870, tzinfo=datetime.timezone.utc))} (T+65163069 ms) 2026-03-25 15:34:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 33, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774452807.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65100.001, raw_value=65100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 28, 900653, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903687, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903729, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903764, tzinfo=datetime.timezone.utc))} (T+65163070 ms) 2026-03-25 15:34:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65163071 ms) 2026-03-25 15:34:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65163071 ms) 2026-03-25 15:34:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 34, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452867.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65160.001, raw_value=65160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903827, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903854, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903870, tzinfo=datetime.timezone.utc))} (T+65163071 ms) 2026-03-25 15:34:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 33, 27, 878192, tzinfo=datetime.timezone.utc), raw_value=1774452807.878192, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878309, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65100.001, raw_value=65100.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 27, 878526, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 28, 900653, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903659, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903687, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903698, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903709, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903719, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903729, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903740, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903750, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 33, 30, 903764, tzinfo=datetime.timezone.utc))} (T+65163072 ms) 2026-03-25 15:35:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65223068 ms) 2026-03-25 15:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65223068 ms) 2026-03-25 15:35:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 35, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774452927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65220.001, raw_value=65220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903915, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903946, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904011, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904025, tzinfo=datetime.timezone.utc))} (T+65223069 ms) 2026-03-25 15:35:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 34, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452867.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65160.001, raw_value=65160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903827, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903854, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903870, tzinfo=datetime.timezone.utc))} (T+65223070 ms) 2026-03-25 15:35:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65223071 ms) 2026-03-25 15:35:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65223071 ms) 2026-03-25 15:35:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 35, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774452927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65220.001, raw_value=65220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903915, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903946, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904011, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904025, tzinfo=datetime.timezone.utc))} (T+65223072 ms) 2026-03-25 15:35:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 34, 27, 878181, tzinfo=datetime.timezone.utc), raw_value=1774452867.878181, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878294, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65160.001, raw_value=65160.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 27, 878511, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 28, 900743, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903752, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903780, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903795, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903806, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903817, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903827, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903842, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903854, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 34, 30, 903870, tzinfo=datetime.timezone.utc))} (T+65223072 ms) 2026-03-25 15:36:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65283067 ms) 2026-03-25 15:36:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65283068 ms) 2026-03-25 15:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 36, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774452987.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65280.001, raw_value=65280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903514, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903527, tzinfo=datetime.timezone.utc))} (T+65283068 ms) 2026-03-25 15:36:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 35, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774452927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65220.001, raw_value=65220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903915, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903946, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904011, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904025, tzinfo=datetime.timezone.utc))} (T+65283069 ms) 2026-03-25 15:36:30.908 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65283070 ms) 2026-03-25 15:36:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65283070 ms) 2026-03-25 15:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 36, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774452987.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65280.001, raw_value=65280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903514, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903527, tzinfo=datetime.timezone.utc))} (T+65283070 ms) 2026-03-25 15:36:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 35, 27, 878187, tzinfo=datetime.timezone.utc), raw_value=1774452927.878187, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878304, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65220.001, raw_value=65220.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 27, 878522, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 28, 900936, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903915, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903946, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903957, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903968, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903979, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 903989, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904001, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904011, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 35, 30, 904025, tzinfo=datetime.timezone.utc))} (T+65283071 ms) 2026-03-25 15:37:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65343067 ms) 2026-03-25 15:37:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65343068 ms) 2026-03-25 15:37:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 37, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774453047.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65340.001, raw_value=65340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 28, 900604, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903610, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903638, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903696, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903706, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903719, tzinfo=datetime.timezone.utc))} (T+65343069 ms) 2026-03-25 15:37:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 36, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774452987.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65280.001, raw_value=65280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903514, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903527, tzinfo=datetime.timezone.utc))} (T+65343070 ms) 2026-03-25 15:37:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65343071 ms) 2026-03-25 15:37:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65343071 ms) 2026-03-25 15:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 37, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774453047.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65340.001, raw_value=65340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 28, 900604, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903610, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903638, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903696, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903706, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903719, tzinfo=datetime.timezone.utc))} (T+65343071 ms) 2026-03-25 15:37:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 36, 27, 878159, tzinfo=datetime.timezone.utc), raw_value=1774452987.878159, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878277, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65280.001, raw_value=65280.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 27, 878493, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 28, 900399, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903421, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903448, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903460, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903470, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903480, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903493, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903504, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903514, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 36, 30, 903527, tzinfo=datetime.timezone.utc))} (T+65343072 ms) 2026-03-25 15:38:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65403067 ms) 2026-03-25 15:38:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65403068 ms) 2026-03-25 15:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 38, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774453107.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65400.001, raw_value=65400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903576, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903691, tzinfo=datetime.timezone.utc))} (T+65403071 ms) 2026-03-25 15:38:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 37, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774453047.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65340.001, raw_value=65340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 28, 900604, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903610, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903638, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903696, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903706, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903719, tzinfo=datetime.timezone.utc))} (T+65403072 ms) 2026-03-25 15:38:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65403073 ms) 2026-03-25 15:38:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65403073 ms) 2026-03-25 15:38:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 38, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774453107.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65400.001, raw_value=65400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903576, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903691, tzinfo=datetime.timezone.utc))} (T+65403081 ms) 2026-03-25 15:38:30.920 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 37, 27, 878172, tzinfo=datetime.timezone.utc), raw_value=1774453047.878172, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878288, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65340.001, raw_value=65340.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 27, 878506, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 28, 900604, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903610, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903638, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903650, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903660, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903670, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903683, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903696, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903706, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 37, 30, 903719, tzinfo=datetime.timezone.utc))} (T+65403082 ms) 2026-03-25 15:39:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65463068 ms) 2026-03-25 15:39:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65463068 ms) 2026-03-25 15:39:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 39, 27, 878127, tzinfo=datetime.timezone.utc), raw_value=1774453167.878127, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65460.001, raw_value=65460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 28, 900809, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903808, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903849, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65463070 ms) 2026-03-25 15:39:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 38, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774453107.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65400.001, raw_value=65400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903576, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903691, tzinfo=datetime.timezone.utc))} (T+65463071 ms) 2026-03-25 15:39:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65463071 ms) 2026-03-25 15:39:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65463071 ms) 2026-03-25 15:39:30.914 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 39, 27, 878127, tzinfo=datetime.timezone.utc), raw_value=1774453167.878127, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65460.001, raw_value=65460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 28, 900809, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903808, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903849, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65463076 ms) 2026-03-25 15:39:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 38, 27, 878156, tzinfo=datetime.timezone.utc), raw_value=1774453107.878156, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878264, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65400.001, raw_value=65400.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 27, 878473, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 28, 900542, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903576, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903604, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903619, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903630, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903640, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903650, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903662, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903677, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 38, 30, 903691, tzinfo=datetime.timezone.utc))} (T+65463077 ms) 2026-03-25 15:40:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65523068 ms) 2026-03-25 15:40:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65523068 ms) 2026-03-25 15:40:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 40, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774453227.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65520.001, raw_value=65520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 28, 900441, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903533, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903585, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903640, tzinfo=datetime.timezone.utc))} (T+65523070 ms) 2026-03-25 15:40:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 39, 27, 878127, tzinfo=datetime.timezone.utc), raw_value=1774453167.878127, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65460.001, raw_value=65460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 28, 900809, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903808, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903849, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65523071 ms) 2026-03-25 15:40:30.911 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65523072 ms) 2026-03-25 15:40:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65523072 ms) 2026-03-25 15:40:30.915 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 40, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774453227.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65520.001, raw_value=65520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 28, 900441, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903533, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903585, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903640, tzinfo=datetime.timezone.utc))} (T+65523077 ms) 2026-03-25 15:40:30.916 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 39, 27, 878127, tzinfo=datetime.timezone.utc), raw_value=1774453167.878127, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878240, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65460.001, raw_value=65460.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 27, 878458, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 28, 900809, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903808, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903838, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903849, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903860, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903870, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903883, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903894, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903904, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 39, 30, 903918, tzinfo=datetime.timezone.utc))} (T+65523077 ms) 2026-03-25 15:41:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65583068 ms) 2026-03-25 15:41:30.906 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65583068 ms) 2026-03-25 15:41:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 41, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774453287.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65580.001, raw_value=65580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 28, 900707, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903714, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903725, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903758, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903780, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903793, tzinfo=datetime.timezone.utc))} (T+65583069 ms) 2026-03-25 15:41:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 40, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774453227.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65520.001, raw_value=65520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 28, 900441, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903533, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903585, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903640, tzinfo=datetime.timezone.utc))} (T+65583070 ms) 2026-03-25 15:41:30.909 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65583071 ms) 2026-03-25 15:41:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65583071 ms) 2026-03-25 15:41:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 41, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774453287.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65580.001, raw_value=65580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 28, 900707, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903714, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903725, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903758, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903780, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903793, tzinfo=datetime.timezone.utc))} (T+65583072 ms) 2026-03-25 15:41:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 40, 27, 878147, tzinfo=datetime.timezone.utc), raw_value=1774453227.878147, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878258, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65520.001, raw_value=65520.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 27, 878472, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 28, 900441, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903533, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903563, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903575, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903585, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903596, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903605, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903617, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903627, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 40, 30, 903640, tzinfo=datetime.timezone.utc))} (T+65583073 ms) 2026-03-25 15:42:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65643068 ms) 2026-03-25 15:42:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65643068 ms) 2026-03-25 15:42:30.908 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 42, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774453347.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65640.001, raw_value=65640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 27, 878537, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 28, 900826, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903799, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903828, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903854, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903864, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903874, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903884, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903895, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903908, tzinfo=datetime.timezone.utc))} (T+65643070 ms) 2026-03-25 15:42:30.909 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 41, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774453287.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65580.001, raw_value=65580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 28, 900707, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903714, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903725, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903758, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903780, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903793, tzinfo=datetime.timezone.utc))} (T+65643071 ms) 2026-03-25 15:42:30.910 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'v_lvd' (T+65643071 ms) 2026-03-25 15:42:30.910 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 362, in check_battery_voltage low_voltage_val, _ = self.now_then(input_data, 'v_lvd') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'v_lvd' (T+65643072 ms) 2026-03-25 15:42:30.911 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Current data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 42, 27, 878215, tzinfo=datetime.timezone.utc), raw_value=1774453347.878215, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 27, 878327, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65640.001, raw_value=65640.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 27, 878537, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 28, 900826, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903799, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903828, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903842, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903854, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903864, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903874, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903884, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903895, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 42, 30, 903908, tzinfo=datetime.timezone.utc))} (T+65643073 ms) 2026-03-25 15:42:30.912 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Previous data: {'time': DataValue(data_type=DataType(name='time', conversion='time_posix', binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={'use_local': False, 'strip_tz': False}, full_name='Time (UTC)', unit='s', uncertainty=1e-09, range=(None, None), header_bytes=None), value=datetime.datetime(2026, 3, 25, 15, 41, 27, 878152, tzinfo=datetime.timezone.utc), raw_value=1774453287.878152, uncertainty=1e-09, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878269, tzinfo=datetime.timezone.utc)), 'runtime': DataValue(data_type=DataType(name='runtime', conversion=True, binary_type='d', input_type='d', digits=None, na_marker=None, conversion_kwargs={}, full_name='Runtime', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value=65580.001, raw_value=65580.001, uncertainty=0.001, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 27, 878492, tzinfo=datetime.timezone.utc)), 'ping': DataValue(data_type=DataType(name='ping', conversion=True, binary_type='i', input_type='i', digits=None, na_marker=None, conversion_kwargs={}, full_name='Ping Retcode', unit=False, uncertainty=False, range=(None, None), header_bytes=None), value=1, raw_value=1, uncertainty=False, _is_na=None, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 28, 900707, tzinfo=datetime.timezone.utc)), 'sequence_count': DataValue(data_type=DataType(name='sequence_count', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Sequence Count', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903686, tzinfo=datetime.timezone.utc)), 'timestamp': DataValue(data_type=DataType(name='timestamp', conversion='time_posix', binary_type='q', input_type='q', digits=None, na_marker=None, conversion_kwargs={'divisor_to_s': 1000}, full_name='Timestamp', unit='s', uncertainty=0.001, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=0.001, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903714, tzinfo=datetime.timezone.utc)), 'crc_errors': DataValue(data_type=DataType(name='crc_errors', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='CRC Errors', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903725, tzinfo=datetime.timezone.utc)), 'valid_packets': DataValue(data_type=DataType(name='valid_packets', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Valid Packets', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903736, tzinfo=datetime.timezone.utc)), 'bytes_read': DataValue(data_type=DataType(name='bytes_read', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Read', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903747, tzinfo=datetime.timezone.utc)), 'bytes_written': DataValue(data_type=DataType(name='bytes_written', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Data Written', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903758, tzinfo=datetime.timezone.utc)), 'bytes_remaining': DataValue(data_type=DataType(name='bytes_remaining', conversion='custom', binary_type='Q', input_type='Q', digits=9, na_marker=None, conversion_kwargs={'base': 10, 'power': -9}, full_name='Disk Remaining', unit='GB', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903769, tzinfo=datetime.timezone.utc)), 'packets_sent': DataValue(data_type=DataType(name='packets_sent', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Sent', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903780, tzinfo=datetime.timezone.utc)), 'packets_dropped': DataValue(data_type=DataType(name='packets_dropped', conversion=True, binary_type='I', input_type='I', digits=None, na_marker=None, conversion_kwargs={}, full_name='Packets Dropped', unit='', uncertainty=False, range=(None, None), header_bytes=None), value='NA', raw_value='NA', uncertainty=False, _is_na=True, timestamp=datetime.datetime(2026, 3, 25, 15, 41, 30, 903793, tzinfo=datetime.timezone.utc))} (T+65643074 ms) 2026-03-25 15:43:30.906 | ERROR | Telemetry Process | plugins.state_monitor.StateMonitor | KeyError evaluating in on step State Monitor: 'adc_vl_f' (T+65703068 ms) 2026-03-25 15:43:30.907 | INFO | Telemetry Process | plugins.state_monitor.StateMonitor | Error details: Traceback (most recent call last): File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 208, in run_checks msg = check_fn(input_data) File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 276, in check_power load_now, load_pre = self.now_then(input_data, 'adc_vl_f') File "/home/pi/dev/mjolnir-hamma/plugins/state_monitor.py", line 149, in now_then now_val = input_data[key].value KeyError: 'adc_vl_f' (T+65703068 ms)